• 6.初探Asynctask


    AsyncTask定义了三种泛型类型 Params,Progress和Result。

    Params 启动任务执行的输入参数,比如HTTP请求的URL。
    Progress 后台任务执行的百分比。
    Result 后台执行任务最终返回的结果,比如String。
    使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

    doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
    onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
    有必要的话你还得重写以下这三个方法,但不是必须的:

    onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
    onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
    onCancelled() 用户调用取消时,要做的操作
    使用AsyncTask类,以下是几条必须遵守的准则:

    Task的实例必须在UI thread中创建;
    execute方法必须在UI thread中调用;
    不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
    该task只能被执行一次,否则多次调用时将会出现异常;

    下面我写的一个AsyncTask简单例子:

     1 public class MainActivity extends Activity implements View.OnClickListener {
     2 
     3     private static final String TAG = MainActivity.class.getSimpleName();
     4     private Button mButton = null;
     5     @Override
     6     protected void onCreate(Bundle savedInstanceState) {
     7         super.onCreate(savedInstanceState);
     8         setContentView(R.layout.activity_main);
     9         initView();
    10     }
    11 
    12     public void initView(){
    13         mButton = (Button)findViewById(R.id.button);
    14         mButton.setOnClickListener(this);
    15     }
    16 
    17     @Override
    18     public void onClick(View view) {
    19         if (view == mButton){
    20             // 保证AsyncTask在Android 3.0以上版本并行
    21             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
    22                 Log.v(TAG,"BUILD11111");
    23                 new NewAsyncTask("AsyncTask#1111").
    24                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
    25                 new NewAsyncTask("AsyncTask#2222").
    26                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
    27                 new NewAsyncTask("AsyncTask#3333").
    28                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
    29                 new NewAsyncTask("AsyncTask#4444").
    30                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
    31                 new NewAsyncTask("AsyncTask#5555").
    32                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
    33                 Log.v(TAG,"BUILD22222");
    34             }
    35         }
    36 
    37     }
    38 
    39     private static class NewAsyncTask extends AsyncTask<String, Integer, String>{
    40         private String mName = "AsyncTask";
    41         public NewAsyncTask(String name){
    42             super();
    43             mName = name;
    44         }
    45         @Override
    46         protected String doInBackground(String... strings) {
    47             try{
    48                 Log.v(TAG,"doInBackground====");
    49                 Thread.sleep(3000);
    50             }catch (InterruptedException e){
    51                 e.printStackTrace();
    52             }
    53             return mName;
    54         }
    55 
    56         @Override
    57         protected void onPostExecute(String result){
    58             super.onPostExecute(result);
    59             SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    60             Log.v(TAG, result + "execute finish at" + df.format(new Date()));
    61         }
    62     }
    63 }

    运行效果:

    最后总结一下:

    Asynctask默认支持可并发任务数量是5个,使用AsyncTask,你要做的是继承父类,然后重写doInBackground(Params...),在里面实现后台操作,如果有返回结果的话,重写onPostExecute(Result),然后处理后台程序的结果。
    如果需要更新进度的话,在onPreExecute()里实例化进度条(也可以不在这),之后在doInBackground(Params...)里面用publishProgress()发布进度值,然后重写onProgressUpdate(Progress...)接收onPreExecute()发布的结果,并添加更新进度条的代码。

  • 相关阅读:
    获取自己的网络出口IP地址
    go语言开发IDE
    国内可用的python源
    Tomcat 配置及优化
    大小不固定的图片和多行文字的垂直水平居中
    行内元素与块级元素比较全面的区别和转换
    常用的四种CSS样式表格
    JS鼠标事件大全
    Javascript 5种方法实现过滤删除前后所有空格
    JavaScript trim 实现(去除字符串首尾指定字符)
  • 原文地址:https://www.cnblogs.com/benchao/p/6114019.html
Copyright © 2020-2023  润新知