AsycnTask

    • AsycnTask
      • 代码

AsycnTask

  • AsyncTask主要是用于异步操作的,比如网络请求跟刷新UI操作,网络请求需要在主线程中,刷新UI 需要在子线程中
  • execute():启动AsyncTask
  • onPreExecute():启动AsyncTask就调用,是在主线程中执行
  • doInBackground():onPreExecute()执行完后调用,是在子线程中执行
  • onPostExecute():doInBackground()执行后调用的,是在主线程执行 的
  • onProgressUpdate():用于实时刷新UI
  • AsyncTask<参数一,参数二,参数三>
    • 参数一:是execute方法的参数,也是doInBackground()方法的参数
    • 第二个参数是publishProgress方法的参数类型,也是onProgressUpdate方法的参数类型
    • 第三个参数是从后台返回到前台的数据类型,也是doInBackground()方法的返回值

代码


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
    }

    public void click(View view) {
        //第一个参数是execute方法的参数,也是doInBackground()方法的参数
        //第二个参数是publishProgress方法的参数类型,也是onProgressUpdate方法的参数类型
        //第三个参数是从后台返回到前台的数据类型,也是doInBackground()方法的返回值
        AsyncTask asyncTask = new AsyncTask() {

            //这个方法在doInBackground方法之前执行,并且是在主线程中执行,可以做一些网络请求前的初始化操作
            @Override
            protected void onPreExecute() {
                Log.v("lai", "准备中。。。。");
            }

            // 执行子线程的方法
            @Override
            protected String doInBackground(String... params) {
                Log.v("lai", params[0]);

                //模拟一个耗时操作
                for (int i = 1; i <= 100; i++) {
                    SystemClock.sleep(50);
                    //通知onProgressUpdate方法修改UI
                    publishProgress(i);
                }

                String result = "请求完毕。。。";

                return result;
            }

            //这个方法用来实时刷新UI的,一般和doInBackground方法结合使用的
            @Override
            protected void onProgressUpdate(Integer... values) {
                tv.setText(values[0].intValue() + "");
            }

            //doInBackground方法执行完后,会执行该方法,并且该方法是在主线程执行的
            @Override
            protected void onPostExecute(String result) {
                Log.v("lai", result);
                //刷新UI只能在主线程中操作
                Toast.makeText(MainActivity.this, "我是吐司", 0).show();
            }

        };

        //启动一个耗时操作
        asyncTask.execute("网络请求开始啦。。。。");
    }
}

你可能感兴趣的:(android)