`
melord
  • 浏览: 145673 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Thread.join()在AsyncTask中的妙用

阅读更多

问题

在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;
            }
 

 

分享到:
评论

相关推荐

    L17-线程间通信-讲义.pdf

    - **AsyncTask的内存泄漏**:由于运行中的线程和静态对象都属于GC Root,即使使用AsyncTask,只要任务执行时间不超过一定阈值,一般不需要特别处理内存泄漏。 7. **Service与IntentService** - **Service**:提供...

    22-线程间通信和Android多线程1

    - `AsyncTask`是简化版的异步任务框架,内部使用了Handler机制,但在某些情况下可能导致内存泄漏,特别是当AsyncTask与Activity生命周期绑定时。 7. **服务(Service)**: - `Service`用于在后台运行的组件,不...

    Android Thread

    4. AsyncTask:Android提供的轻量级线程工具,适用于简单的异步任务,但不推荐在大型项目中使用,因为它会随着Android版本的更新而弃用。 5. Executor框架:使用`ExecutorService`、`ThreadPoolExecutor`等,实现更...

    Android 多线程下载简单demo之Thread

    在Android中,我们可以使用Java的`Thread`类或者`AsyncTask`来创建线程,但考虑到线程管理,通常推荐使用`AsyncTask`,因为它能更好地与UI线程交互。不过,本例中使用了基本的`Thread`类,展示了最基础的多线程下载...

    frameworks 之线程类使用 原生和自定义的线程类

    在Android和Linux开发中,线程的使用是至关重要的,特别是在多任务并行处理和优化应用程序性能时。本文将深入探讨在`frameworks`层如何使用原生和自定义的线程类,以便更好地理解线程管理的核心概念。 首先,我们要...

    音乐播放器

    在需要使用服务的Activity或Fragment中,我们通过`bindService()`方法来绑定服务,并在不再需要时调用`unbindService()`解除绑定。这样,我们就可以在UI组件中调用`MusicBinder`中的方法来控制音乐播放了。 ```java...

    安卓数据库操作例子

    - 使用`AsyncTask`或者`Thread`进行异步数据库操作,以避免阻塞主线程。 7. **数据库性能优化** - 使用合适的数据类型,减少数据冗余。 - 创建索引以加速查询速度,但注意索引也会占用额外空间。 - 合理设计表...

    组播android的客户端和服务端

    可以使用Handler、AsyncTask或者Java的Thread和Runnable来实现。 6. **乱码问题处理**:在接收到数据后,可能会遇到乱码问题,这通常是由于字符编码不匹配导致的。解决方法是确保发送方和接收方使用相同的字符编码...

    coursera-lab-5

    在本实验"coursera-lab-5"中,我们将深入探讨Java编程中的异步任务处理。异步任务是现代软件开发中一个重要的概念,它允许程序在执行其他操作的同时处理耗时的任务,从而提高应用的响应性和效率。在Java中,我们可以...

    Android游戏与应用开发最佳学习路线图收集.pdf

    - **线程处理**:使用Thread、AsyncTask或Handler进行异步操作。 - **消息处理机制**:理解Handler、Looper、Message之间的关系,实现UI更新。 17. **游戏开发**: - **图形图像**:学习Android的2D和3D图形库,...

    org.numixproject.hermes:Numix 的 Android 官方 IRC 客户端

    5. **线程管理**: 由于网络操作通常在后台线程中执行以避免阻塞UI,因此需要理解和使用Handler、AsyncTask或Thread/Runnable来处理并发。 6. **XML布局设计**: 创建用户界面,使用XML文件定义控件和布局。 7. **...

    Android面试

    同时,对多线程的理解,包括线程同步机制(synchronized关键字、wait()、notify()、Thread.join())和并发工具类(ExecutorService、Semaphore、CountDownLatch)的应用,也是衡量开发者技能的重要标准。 关于...

    AopSample:面向切片AOP示例

    虽然Spring框架在Java后端很常见,但在Android开发中,由于其体积和性能问题,开发者更倾向于使用AspectJ。 - **Android Gradle插件**:集成注解处理器和AspectJ编译支持,使得在Android Studio中能够无缝地使用AOP...

    Android-Database-Practice

    可以使用`AsyncTask`, `Thread`, `ExecutorService`,或者直接在Room中使用`@Transaction`注解进行异步操作。 6. **数据缓存和性能优化**: 为了提高性能,可以考虑使用缓存策略,比如LruCache,避免频繁的数据库...

Global site tag (gtag.js) - Google Analytics