AsyncTask更新UI

Thread+Handler更新UI的方法,每个任务都要创建一个线程,线程开销大
Android引入了AsyncTask(轻量级的异步任务类)实现异步操作,更新UI
AsyncTask用到的三种泛型参数:
Params:用于AsyncTask执行任务的参数类型 ,启动任务执行的输入参数,比如HTTP请求URL
Progress:在后台线程处理的过程中,可以阶段性地发布结果的数据类型(后台任务执行的百分比)
Result:任务全部完成后所返回的数据类型(后台执行任务最终返回的结果)

AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params...p),在此方法中实现任务的,执行工作,比如连网获取数据.
实现onPostExecute(Result r)方法,应用程序关心的结果在此方法中返回
AsyncTask一定要在主线程中创建实例
我们只需要去实现AsyncTask中的回调方法,在任务的执行过程中,这些方法会被系统自动调用
1.onPreExecute()
作用:当任务执行之前开始调用此方法
2.doInBackground(Params...)
作用:在后台线程执行,执行耗时操作,在执行过程中可以调用publicProgress(Progress..)来更新
任务的进度.publicProgress()相当于Handler.sendmessage()方法
3.onProgressUpdate(Progress...)
作用:此方法在主线程执行,用于显示任务执行的进度
4.onPostExecute(Result);

作用:此方法在主线程执行,任务执行的结果作为此方法的参数返回

public class MainActivity extends AppCompatActivity {
    private TextView tv;
    private Button download;
    private ProgressBar pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView)findViewById(R.id.textView);
        download = (Button)findViewById(R.id.download);
        pb = (ProgressBar)findViewById(R.id.progressBar);

        download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1)创建对象
                MyAsyncTask myAsyncTask = new MyAsyncTask();
                //2)执行任务
                myAsyncTask.execute("begin");

            }
        });
    }

    private class MyAsyncTask extends AsyncTask{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tv.setText("开始下载");
        }

        //更新UI
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            pb.setProgress(values[0]);
            if(values[0]<100)
                tv.setText("progress="+values[0]+"%");
        }

        //执行耗时操作

        @Override
        protected String doInBackground(String... params) {
            for(int i=0; i<100; i++){
                //向onProgressUpdate发送消息
                publishProgress(i+1);
                try{
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            return "download finished";
        }
        //doInBackground结束后,执行本方法,result是doInBackground方法
        //返回的数据

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            tv.setText(result);
        }
    }
}

AsyncTask更新UI_第1张图片

你可能感兴趣的:(Android,应用)