网上提到最多的就是利用AsyncTask进行异步下载,用android-async-http第三方库的也比较多。这里写点注意事项。
先说说android-async-http,这个库发送请求利用threadpool,也就是不在主线程做发送了,但是需要注意的是,如果你在主线程调用发送函数,网络请求是不在主线程中的,但是回调函数还是在主线程中的,这一点要注意!如果你的回调函数比较复杂,就会影响UI的使用. 这种情况,需要在回调中开新线程进行处理,也可以使用AsyncTask,在AsyncTask中利用同步请求获得所有资源后,进行加工,就不会阻塞主线程了。
android-async-http回调函数在主线程中是因为处理回调的handler默认会建立在调用线程中,下面看看在ios中,回调函数的处理:
先看看最普通的NSURLConnection类,
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
注意,这个函数会创建新的线程发送网络请求。这里,可以通过queue来指定handler的处理线程。
还提供了scheduleInRunLoop:forMode:(接受NSRunloop,更底层,更确切) 和 setDelegateQueue:(接受NSOperationQueue,用起来更方便)指定回调函数执行的线程,注意两者不能同时调用!
而nsurlsession 有delegateQueue (All delegate method calls and completion handlers related to the session are performed on this queue.)
nsurlsession默认会创建新的线程发送task,即task 调用resume后,网络请求会在新的线程中执行。是不是一个task一个线程就不知道了,看不到具体的源码。
http://www.objc.io/issue-5/from-nsurlconnection-to-nsurlsession.html