AsyncTask使用注意事项

AsyncTask在Android中是一个非常重要的类,其作用是在framework层实现了一个异步线程用来执行耗时的操作,Android中要求所有的UI操作都需要在主线程中进行,如果在非UI线程中操作UI会报异常,但往往存在要在非UI线程更新UI元素的场景,为了满足该需求通过AsyncTask能使Android开发者教容易的完成该需求的开发,通过重写doInBackground和onPostExecute方法来实现该需求,一般会在doInBackground方法执行耗时的操作,执行结束之后由onPostExecute方法来更新UI,也就是说doInBackground实在异步线程中执行的而onPostExecute是在主线程中执行的,但是如果一个进程中有多处使用AsyncTask并且,先执行的AsyncTask耗时较长的话就会导致后执行的AsyncTask被阻塞,Demo如下:

测试代码:

package com.android.example; 
    
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
    
public class AsycTaskDemoActivity extends Activity { 
    private static final String LOG_TAG = "AsycTaskDemoActivity"; 
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        Log.d(LOG_TAG, "===========>>onCreate"); 
        setContentView(R.layout.main); 
        Void[] params = new Void[]{null,null,null}; 
        Log.d(LOG_TAG, "===========>>AsyncTaskTestA begin"); 
        new AsyncTaskTestA().execute(params); 
        Log.d(LOG_TAG, "===========>>AsyncTaskTestA end"); 
        Log.d(LOG_TAG, "===========>>AsyncTaskTestB begin"); 
        new AsyncTaskTestB().execute(params); 
        Log.d(LOG_TAG, "===========>>AsyncTaskTestB end"); 
    } 
    
    private class AsyncTaskTestA extends AsyncTask<Void, Void, Void> { 
    
        @Override
        protected void onPostExecute(Void result) { 
            super.onPostExecute(result); 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestA onPostExecute"); 
        } 
    
        @Override
        protected void onPreExecute() { 
            super.onPreExecute(); 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestA onPreExecute"); 
        } 
    
        @Override
        protected Void doInBackground(Void... params) { 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestA doInBackground"); 
            int temp = 0; 
            while (true) { 
                try { 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                temp++; 
                Log.d(LOG_TAG, "===========>>temp  = " + temp); 
                if (temp == 5) { 
                    return null; 
                } 
            } 
        } 
    
    } 
    
    private class AsyncTaskTestB extends AsyncTask<Void, Void, Void> { 
    
        @Override
        protected void onPostExecute(Void result) { 
            super.onPostExecute(result); 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestB onPostExecute"); 
        } 
    
        @Override
        protected void onPreExecute() { 
            super.onPreExecute(); 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestB onPreExecute"); 
        } 
    
        @Override
        protected Void doInBackground(Void... params) { 
            Log.d(LOG_TAG, "===========>>AsyncTaskTestB doInBackground"); 
            int temp = 0; 
            while (true) { 
                try { 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                temp++; 
                Log.d(LOG_TAG, "===========>>temp  = " + temp); 
                if (temp == 5) { 
                    return null; 
                } 
            } 
        } 
    
    } 
    
}

测试结果:

03-27 17:45:28.129 D/AsycTaskDemoActivity( 5222): ===========>>onCreate 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA begin 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA onPreExecute 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA end 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB begin 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB onPreExecute 
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB end 
03-27 17:45:28.349 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA doInBackground 
03-27 17:45:29.369 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 1
03-27 17:45:30.379 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 2
03-27 17:45:31.389 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 3
03-27 17:45:32.399 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 4
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 5
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA onPostExecute 
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB doInBackground 
03-27 17:45:34.429 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 1
03-27 17:45:35.439 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 2
03-27 17:45:36.449 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 3
03-27 17:45:37.459 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 4
03-27 17:45:38.469 D/AsycTaskDemoActivity( 5222): ===========>>temp  = 5
03-27 17:45:38.469 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB onPostExecute

从执行结果来看同一进程多处使用AsyncTask,先执行的AsyncTask会阻塞后边AsyncTask的执行,查看framework代码发现一个进程中的多个AsyncTask使用队列来进行管理的,所以如果先执行的AsyncTask耗时较长的话阻塞后边AsyncTask的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值