问题
在Android Email当中,在设置接收服务器和发送服务器时,点击下一步,系统会弹出进度框,并执行服务器设置检验。如果用户设置信息不正确,在执行校验时,大约会花1分钟的时间去校验,最后才会提示设置信息不正确。如果用户在等待过程中点击了“取消”,然后再点下一步,发会现,不再弹出等待提示框,也不执行校验了。
分析
通过分析源码发现,在点击“下一步”执行校验时,会执行一个AsyncTask,在doIngBackground()中,去打开socket连接,完成相应的校验。同时弹出一个等待提示框。如果用户点击“取消”, 会终止此AsyncTask,并重新生成一个AsyncTask并执行。
但通过debug发现,后面的AsyncTask并没有真正执行。原因是因为前面的Task阻塞在了联网校验上。通过查阅Android文档得知,AsyncTask,是异步处理类。它会新生成一个线程去执行doInBackground。对外,开发者不能获取此线程的引用,就算获取到了,对于像socket连接或IO操作会导致阻塞的作业,强行interrupt线程并不能退出阻塞。
结论
所以为避免之后生气的AsyncTask能够被正常执行,请记住:
不要阻塞doInBackground(),我们应该新建一个线程来完成可能导致阻塞的操作。
解决方法
Thread.join()
@Override
protected Object doInBackground(Void... params) {
Thread thread = new Thread(){
public void run(){
mResult = getFromServer();// 从网络上获取数据
}
};
thread.start();
try{
thread.join(); // 阻塞当前线程,等待thread执行完毕,可以带参数,最多等待多长时间
} catch (InterruptedException e) {
// Thread.join()可以被interrupt,调用AsyncTask.cancel(true);即可退出等待
return null;
}
分享到:
相关推荐
AsyncTask的用法
AsyncTask.java,AsyncTask.java,AsyncTask.java,AsyncTask.java
对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片... AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,...
利用android.os.AsyncTask类完成MP3下载,采用进度条动态显示下载的百分比。是学习AsyncTask不错的例子。
AsyncTask实例代码演示Android异步任务.txt AsyncTask实例代码演示Android异步任务.txt
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 onPostExecute(Result), 在doInBackground 执行完成后...
比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463
使用AsyncTask去加载json,并通过json里面的Item的Url去加载ListView条目的图片。涉及知识点如下: 1. ListView显示内容 xml布局+adapter 2. 获取网络数据 URLConnection+I/O 3. 解析Json JsonObject+...
AsyncTaskTest 异步加载类:http://blog.csdn.net/qqmcy/article/details/39890837 使用文章 将TextureCache类异步加载功能讲解
这是一个使用asynctask类来从网络下载图片的小Demo
在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html
一个ListView的小例子,一开始List中没有内容,通过一个AsyncTask逐步在List中加入条目,适合新手学习AsyncTask多线程,本人整理能运行,有详细的注解。
AsyncTask-Executor 承担在任何 Android 操作系统版本上并发运行 AsyncTask 的所有工作,最好使用: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { task.executeOnExecutor(AsyncTask.THREAD_...
采用两种方式thread+handler和asynctask方式来异步下载网络上的图片
AsyncTask下载网络图片 对话框提示 大家看看阿!
这个demo主要讲解了使用AsyncTask 异步下载网络图片,希望可以帮助需要的同学.
import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content....
主要介绍了Android中异步类AsyncTask用法,分析总结了Async Task类的功能、特点及相关的使用技巧与注意事项,需要的朋友可以参考下
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度