android多线程通信2:AsyncTask

一、适用:

android中特有的多线程通信机制,在activity代码中的指定位置发送消息给UI线程,需继承类AsyncTask。

二、说明:

1. android的ui线程主要用于UI页面初始化、更新,如果在此线程进行耗时操作,则可能出现页面加载失败、缓慢、崩溃等应用异常。

2.ui线程在页面加载onCreate方法时启动,因此直接或间接在onCreate方法中调用耗时较长的方法,可能会造成异常。所以此时需要使用多线性,把耗时任务放入新建线程里面处理,不影响ui线程。

3.耗时线程在处理过程中或者结束可以通过线程通信机制发送消息给ui线程,从而实现ui页面的更新。asynctask是常用的android线程通信机制的一种。

4.doInBackground方法用在耗时线程,目的是发送消息给ui线程

onPreExecute、onProgressUpdate、OnPostExecute方法用在ui线程,目的分别是其他线程的执行前、执行过程中、执行完成后接收消息,然后在ui线程处理(页面显示、更新)
三、示例:

 

MyAsyncTask myAsyncTask=new MyAsyncTask();

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testInfoTv = findViewById(R.id.tv_test_info);        
        myAsyncTask.execute();
    }

/*
此处AsysncTask的3个参数类型,分别需要和doInBackground、onProgressUpdate、onPostExecute一致。
MyAsyncTask是一个匿名类,继承了AsyncTask
*/
private class MyAsyncTask extends AsyncTask<String,String,String> {     

        @Override
        protected void onPreExecute() {
            testInfoTv.setText("测试准备中");
        }

        @Override
        protected String doInBackground(String... strings) {
            int i=0;
            
            while(i<100){

                try {
                    i++;
                    if(i==20) publishProgress("测试进度20%");
                    if(i==100){
                        publishProgress("测试进度100%"); 
                        return "PASS";    
                              }
                    Thread.sleep(1000);            
                    }
                    catch (Exception e) {
                        e.printStackTrace();            
                                         }

            } 
                       
            return "FAIL";
        }

        @Override
        protected void onProgressUpdate(String... values) {
            testInfoTv.setText(values[0].toString());
            /*
            先后执行:
            testInfoTv.setText("测试进度20%");
            testInfoTv.setText("测试进度100%"); 
            */
        }

        @Override
        protected void onPostExecute(String s) {
            switch (s){
                case "PASS": 
                    testInfoTv.setText("测试成功");                  
                    break;
                case "FAIL":  
                    testInfoTv.setText("测试失败");                 
                    break;
                default:                    
                    break;
            }
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值