Asynctask

作者: 萝卜枣 | 来源:发表于2018-04-20 08:45 被阅读0次

    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响应这些消息,并调用相关的回调函数。

    相关文章

      网友评论

          本文标题:Asynctask

          本文链接:https://www.haomeiwen.com/subject/werlqftx.html