• 使用AsyncTask


    优点:十分简单地从子线程切换到主线程,要创建一个子类去继承它.在集成时我们可以为AsyncTask类指定3个泛型参数,这三个参数的用途如下.
    Params 在执行AsyncTask时需要传入的参数,可用于在后台任务中使用
    Progress 后台任务执行时,如果需要在界面上显示当前的进度,则使用这里的泛型做进度单位
    Result 当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型.
    一个最简单的自定义AsyncTask就可以写下如下方式

    class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
    }

    第一个泛型指定为void,表示在执行AsyncTask的时候不需要传入参数给后台任务,第二个泛型参数指定为Integer,表示使用整型数据来作为进度显示单位.第三个泛型单位指定为Boolean,则表示使用布尔型数据来执行结果

    自定义AsyncTask 代码如下

    public class DownloadTask extends AsyncTask<Void,Integer,Boolean> {
    
        ProgressDialog progressDialog;
    
        Context context;
    
        protected void onPreExecute(){
            progressDialog.show();//显示进度对话框
        }
        @Override
        protected Boolean doInBackground(Void... params) {
           try {
               while (true){
                   int downloadPercent = doDownload(); //这是一个虚构的方法
                   publishProgress(downloadPercent);
                   if(downloadPercent >= 100){
                       break;
                   }
               }
           }catch (Exception e){
               return false;
           }
            return true;
        }
    
        private int doDownload() {
            return 0;
        }
    
        protected void onProgressUpdate(Integer... values){
            //在这里更新下载速度
            progressDialog.setMessage("Downloaded" + values[0] +"%");
        }
        protected void onPostExecute(Boolean result){
            progressDialog.dismiss(); //关闭进度对话框
            //在这里提示下载结果
            if(result){
                Toast.makeText(content,"Download succeed",Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(content,"Download failed",Toast.LENGTH_SHORT).show();
            }
    
        }
    }
    

    AsyncTask的诀窍就是 在doInbackground()中执行具体的耗时任务,在onProgressUpdate()方法中进行UI操作,在onPreExecute()方法中执行一些任务的收尾工作。
    如果想要启动这个任务,只需要编写以下代码

    new DownloadTask().execute();
  • 相关阅读:
    c# linq.Where+Func<object,bool>筛选数据
    【转】深入线程安全容器的实现方法
    c# 泛型+反射
    c# List<接口>小技巧
    winfrom的右击菜单项事件中如何获取关联控件的引用
    ASP.NET 1.0
    让包含GridView的div或panel的滚动条自己拉到底部怎么做?
    微软的IE中调试JavaScript的工具下载链接
    ASP.NET调试启动默认浏览器如何设置
    C# WinForm的PictureBox控件图片的拉伸或收缩方式跟随着控件的大小
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781924.html
Copyright © 2020-2023  润新知