- AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。
案例会穿插注释讲解:
1、MyTask继承AsyncTask
public class MyTask extends AsyncTask<Void, String, Boolean> {
private static final String TAG = "chenxh Async";
private Context mContext;
private IDataTrans trans;
private ProgressDialog progressDialog;
public MyTask(Context mContext, IDataTrans trans) {
progressDialog = new ProgressDialog(mContext);
this.mContext = mContext;
this.trans = trans;
}
/**
*
* 这个方法会在后台任务开始执行之间调用,
* 用于进行一些界面上的初始化操作,
* 可以显示ProgressDialog等。
*
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage("加载中...");
progressDialog.setCancelable(false);
progressDialog.setIcon(R.mipmap.ic_launcher);
progressDialog.setTitle("提示");
Log.e(TAG, "onPreExecute: ");
progressDialog.show();
}
/**
*
* 这个方法在子线程中运行,
* 会处理耗时任务。
* 实现的接口第三个泛型,通过return返回值判断任务完成。
* <p>
* 在处理中需要处理UI类 ,可以调用publishProgress()方法,会调用onProgressUpdate方法
*
*/
@Override
protected Boolean doInBackground(Void... voids) {
Log.e(TAG, "doInBackground: ");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress("加载完成111111111");
Log.e(TAG, "doInBackground: 111111111111");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress("加载完成222222222");
Log.e(TAG, "doInBackground: 222222222222");
return false;
}
/**
*
* 如果doInBackground方法执行了publishProgress(),
* 会在onProgressUpdate进行处理,可以进行UI的操作
*
*/
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Log.e(TAG, "onProgressUpdate: ");
progressDialog.setMessage(values[0]);
}
/**
*
* doInBackground返回的值可以在这里进行处理,
* 通过接口回调等方式,传给Async调用者
*
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
Log.e(TAG, "onPostExecute: ");
if (false == aBoolean) {
trans.getMessage("加载完成。123。。");
progressDialog.dismiss();
}
}
}
2、接口,用于数据传输
public interface IDataTrans {
void getMessage(String msg);
}
3、MainAcitivity.java
通过execute()调用AsyncTask资源。
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initControl();
}
private void initControl() {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MyTask(MainActivity.this, new IDataTrans() {
@Override
public void getMessage(String msg) {
textView.setText(msg);
}
}).execute();
}
});
}
private void initView() {
btn = (Button) findViewById(R.id.test_async_btn);
textView = (TextView) findViewById(R.id.text);
}
}