异步线程之AsyncTask

Posted 丨丿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步线程之AsyncTask相关的知识,希望对你有一定的参考价值。

1、使用新线程的原因:
android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件,因此其它其它操作不应该、也不能阻止UI线程,否则UI界面将会变得停止响应。
2、解决新线程不能更新UI组件的问题
    2.1、使用Handler实现线程通信
    2.2、Activity.runOnUiThread(Runnable)
    2.3、View.post(Runnable)
    2.4、View.postDelayed(Runnable)
    2.5、AsyncTask


3、AsyncTask的使用:AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承
    3.1、参数介绍:Params,启动任务执行输入参数的类型,Progress后台任务完成的进度值的类型,Result后台完成后返回结果的类型
    3.2、方法介绍:
          3.2.1、AsyncTask.cancel(boolean)如果是true,如果线程执行,则会被打断,如果是false,线程将会被运行执行完成
           3.2.2、onPreExecute()//一般用来做一些初始化操作
           3.2.3、doInBackground(String... strings)//处理后台线程要完成的任务
           3.2.4、onProgressUpdate(Integer ... values)
                //在doInBackgrounp()方法中调用 publishProgress(Progress... values)方法更新任务执行的进度,将会触发该方法
           3.2.5、onPostExecute(Integer result)//doInBackGrounp()完成后自动调用此方法,用来处理结果
        new AsyncTask<String,Void,Integer>(){//如果为泛型参数,就设为void
            
            protected void onPreExecute() {}

            //处理后台线程要完成的任务
            protected Integer doInBackground(String... strings) {
                //strings[0]=account  strings[1]=pwd
                return loginCode;
            }
            
            protected void onProgressUpdate(Integer ... values){}

            //doInBackGrounp()完成后自动调用此方法,用来处理结果
            protected void onPostExecute(Integer result) {} 
        }.execute(account,pwd,host);
     3.3、超时处理    
        private Handler uiHandler = new Handler(){
            public void handleMessage(Message msg) {
                switch(msg.what){
                case cancelMyTask:
                    if(myTask!=null && !myTask.isCancelled()
                        && myTask.getStatus() == AsyncTask.Status.RUNNING){
                        myTask.cancel(true);
                        myTask = null;
                        showLayout.setVisibility(View.GONE);
                        MyToast.showToastLong(context, "连接超时");
                    }
                    break;
                }
            }
        };

        final MyTask myTask = new MyTask();//继承AsyncTask
        //只是打断AsyncTask,并没有结束掉myTask.cancel(true);        
        myTask.execute(account,pwd,host);
        Thread thread = new Thread(){
            public void run(){
                try{
                    myTask.get(5000, TimeUnit.MILLISECONDS);
                }catch(InterruptedException e){
                }catch(ExecutionException e){
                }catch(TimeoutException e){
                    uiHandler.sendEmptyMessage(cancelMyTask);;
                }
            }
        };
        

 

以上是关于异步线程之AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

异步线程之AsyncTask

Android多线程分析之五:使用AsyncTask异步下载图像

为啥我的 AsyncTask 在主线程上运行?

android源码解析之-->异步任务AsyncTask

Android源代码解析之--&gt;HandlerThread

Android中的异步任务不使用AsyncTask