Asynctask

1.什么是Asynctask?

异步任务,一般用来更新UI进程,比较耗时的操作可以在里面进行(短时间)。本质上就是一个封装了线程池和Handler的异步框架。

2.使用  三个参数  5个方法

public class MainActivity extends AppCompatActivity {

    private Button execute;

    private Button cancel;

    private ProgressBar progressBar;

    private TextView textView;

    private MyTask mTask;

 @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progress_bar);

        textView = findViewById(R.id.text_view);

        execute = findViewById(R.id.execute);

        cancel = (Button) findViewById(R.id.cancel);

        execute.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                //注意每次需要new一个实例,新建的任务只能执行一次,否则会出现异常。

                mTask = new MyTask();

                mTask.execute();

                execute.setEnabled(false);

                cancel.setEnabled(true);

            }

        });

        cancel.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

       //取消一个正在执行的任务,onCancelled方法将会被调用

                mTask.cancel(true);

            }

        });

    }

    class MyTask extends AsyncTask<String, Integer, String> {

        //用于在执行后台任务前做一些UI操作

      @Override

        protected void onPreExecute() {

            super.onPreExecute();

            textView.setText("loading...");

        }

//内部执行后台任务,不可在此方法内修改UI 

        @Override

        protected String doInBackground(String... params) {

            int i = 0;

            while (i<100){

                i=i*2;

                publishProgress(i);

                try {

                    Thread.sleep(500);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

            return null;

        }

//用于更新进度信息

        @Override

        protected void onProgressUpdate(Integer... values) {

            super.onProgressUpdate(values);

            progressBar.setProgress(values[0]);

            textView.setText("loading..." + values[0] + "%");

        }

//用于在执行完后台任务后更新UI,显示结果

        @Override

        protected void onPostExecute(String result) {

            super.onPostExecute(result);

            textView.setText(result);

            execute.setEnabled(true);

            cancel.setEnabled(false);

        }

//在取消执行中的任务时更改UI

        @Override

      protected void onCancelled() {

            super.onCancelled();

            textView.setText("cancelled");

            progressBar.setProgress(0);

            execute.setEnabled(true);

            cancel.setEnabled(false);

        }

    }

}

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <Button

android:id="@+id/execute"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="execute"/>

    <Button

        android:id="@+id/cancel"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:enabled="false"

        android:text="cancel"/>

 <ProgressBar

        android:id="@+id/progress_bar"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:progress="0"

        android:max="100"

        style="?android:attr/progressBarStyleHorizontal"/>

    <ScrollView

 android:layout_width="fill_parent"

        android:layout_height="wrap_content">

        <TextView

            android:id="@+id/text_view"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"/>

    </ScrollView>

</LinearLayout>

3.机制原理

1)AsyncTask本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行;

2)线程池中的工作线程执行DoInBackground(mParams)方法执行异步任务

3)当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容