异步类AsyncTask学习

来源:互联网 发布:java pdf转图片 编辑:程序博客网 时间:2024/06/05 15:21

异步类AsyncTask学习


AsyncTask是android当中封装好的一个异步类,用来简化异步操作。
异步类的主要目的是在子线程执行耗时的操作(连接网络,读取文件等),避免ANR。

AsyncTask传入三个泛型参数:
params:启动任务时输入参数的类型
progress:后台执行任务返回的进度值类型
result:后台执行完成后返回的结果类型

AsyncTask回调方法如下如所示:
这里写图片描述

下面实现了一个很简单的asynctask,模拟子线程连接网络。
MainActivity.java

package com.bupt.markfavor.demo0921async;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    private TextView textView;    private Button button;    private ProgressBar progressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView) findViewById(R.id.state);        button = (Button) findViewById(R.id.button);        progressBar = (ProgressBar) findViewById(R.id.progressbar);        progressBar.setMax(100);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                MyAsyncTask myAsyncTask = new MyAsyncTask(textView,progressBar);                myAsyncTask.execute(10);            }        });    }}

这里定义了一个文本框,进度条,按钮。进度条可以显示任务进程的执行情况。

MyAsyncTask.java

package com.bupt.markfavor.demo0921async;import android.os.AsyncTask;import android.util.Log;import android.widget.ProgressBar;import android.widget.TextView;public class MyAsyncTask extends AsyncTask<Integer,Integer,String> {    private static final String TAG = "MyAsyncTask";    private TextView textView;    private ProgressBar progressBar;    public MyAsyncTask(TextView textView, ProgressBar progressBar) {        super();        this.textView=textView;        this.progressBar=progressBar;    }    @Override    protected void onPostExecute(String result) {        textView.setText("异步操作执行结束,返回结果:"+result);    }    @Override    protected void onPreExecute() {        super.onPreExecute();        textView.setText("开始执行异步线程");    }    @Override    protected void onProgressUpdate(Integer... values) {        int value=values[0];        progressBar.setProgress(value);    }    @Override    protected String doInBackground(Integer... params) {        int i;        DataOperator myDataOperator = new DataOperator();        for (i=params[0];i<=100;i+=10){            Log.e(TAG, "doInBackground: "+Thread.currentThread().getName() );            myDataOperator.dataOperator();            publishProgress(i);//传入进度值        }        return "ok";        }    }

上边的代码按照之前图片里的内容实现了异步任务的复写,operator实现了线程睡眠一秒,让过程更清晰。

package com.bupt.markfavor.demo0921async;import android.util.Log;/** * Created by markfavor on 2017/9/21. */public class DataOperator {    private static final String TAG = "DataOperator";    public void dataOperator() {        try {            Log.e(TAG, "DataOperator: "+Thread.currentThread().getName() );            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

最后加上布局文件。progressbar里的style控制progressbar的形状。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.bupt.markfavor.demo0921async.MainActivity"    android:orientation="vertical">    <TextView        android:id="@+id/state"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="progress" />    <ProgressBar        android:id="@+id/progressbar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Horizontal"/>    <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="button"/></LinearLayout>
原创粉丝点击