zoukankan      html  css  js  c++  java
  • Android AsyncTask简单用法

    三个泛型参数:

      Param 任务执行器需要的数据类型

      Progress 后台计算中使用的进度单位数据类型

      Result 后台计算返回结果的数据类型有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask

    四个步骤:onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。doInBackground(Params),后台进程执行的具体计算在这里实 现,doInBackground(Params)AsyncTask的关键,此方法必须重载。在这个方法内可以使用 publishProgress(Progress)改变当前的进度值。onProgressUpdate(Progress),运行于UI线程。如果在doInBackground(Params)中 使用了publishProgress(Progress),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params)的返回值。此方法也要经常重载,如果Resultnull表明后台任务没有完成(被取消或者出现异常)

      这4个方法都不能手动调用。而且除了doInBackground(Params)方法,其余3个方法都是被UI线程所调用的,所以要求:1) AsyncTask的实例必须在UI thread中创建;2) AsyncTask.execute方法必须在UI thread中调用;

    Task只能被执行一次,多次调用时将会出现异常,而且是不能手动停止。

    import android.app.Activity; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.widget.TextView; 

    public class AsyncTaskTest extends Activity { 
        TextView tv; 
        final String TAG="AsyncTaskTest"; 
      
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
            tv = (TextView) findViewById(R.id.label); 
            new MyTask().execute(6, 12, 7); 
      
        } 
      
        class MyTask extends AsyncTask<Integer, Integer, Integer> { 
      
            @Override 
            protected void onPreExecute() { 
                super.onPreExecute(); 
                Log.d(TAG, "onPreExecute()"); 
            } 
      
            @Override 
            protected Integer doInBackground(Integer... params) { 
                Log.d(TAG, "doInBackground()"); 
                int p = 0; 
                for (int index = 0; index < params.length; index++) { 
                    int num = params[index]; 
                    for (int j = 0; j < num; j++) { 
                        if (num - j <= 0) { 
                            break; 
                        } 
                        p++; 
                        publishProgress(p); 
                        try { 
                            Thread.sleep(500); 
                        } catch (InterruptedException e) { 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
                return p; 
            }
      
            @Override 
            protected void onProgressUpdate(Integer... progress) { 
                Log.d(TAG, "onProgressUpdate()"); 
                tv.append("\nProgress: " + progress[0]); 
            } 
      
            @Override 
            protected void onPostExecute(Integer result) { 
                Log.d(TAG, "onPostExecute()"); 
                tv.append("\nFinished. Result: " + result); 
            } 
      
            @Override 
            protected void onCancelled() { 
                super.onCancelled(); 
                Log.d(TAG, "onCancelled()");
            }
        }
    }  
  • 相关阅读:
    总结第一、二类斯特林数(模板)
    总结组合数的几种求法(模板)
    HDU5521 Meeting(dijkstra+巧妙建图)
    BZOJ4152 The Captain(dijkstra+巧妙建图)
    CF1194D 1-2-K Game (博弈论)
    JavaScript字符串的操作
    JavaScript基础–闭包
    JavsScript基础–声明提升
    JavaScript基础–作用域
    css基础(一)
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/2766871.html
Copyright © 2011-2022 走看看