总结Android中多线程更新应用的页面信息的方式

2019-12-10 18:58:19于海丽
  • onPreExecute(),(可选方法)最新用户调用excute时的接口,任务执行之前调用该方法,可以在这里显示进度对话框。
  • doInBackground(Params...),后台执行比较好使的操作,不能直接操纵UI。在该方法中使用publishProgress(progress...)来更新任务的进度。
  • onProgressUpdate(Progress...),在主线程中执行,显示进度条
  • onPostExecute(Result),此方法可以从doinbackground得到的结果来操作UI,在主线程中执行,执行的结果作为参数返回。
  • onCancelled(Object)调用此方法可以随时取消操作。

    AsyncTask定义的三种泛型

    • params: 启动任务执行的输入参数,如:http请求的URL
    • progress:后台任务执行的百分比
    • result:返回结果,如:String、list集合等
       private class MyTask extends AsyncTask<params, progress, result> { ... }
      

      示例代码:

        private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
           int count = urls.length;
           long totalSize = 0;
           for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
           }
           return totalSize;
         }
      
         protected void onProgressUpdate(Integer... progress) {
           setProgressPercent(progress[0]);
         }
      
         protected void onPostExecute(Long result) {
           showDialog("Downloaded " + result + " bytes");
         }
        }