频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
Android AsyncTask深入了解+案例
2019-01-12 10:23:24           
收藏   我要投稿

AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。

案例会穿插注释讲解:

1、MyTask继承AsyncTask

public class MyTask extends AsyncTask {

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返回值判断任务完成。

*

* 在处理中需要处理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);

}

}

点击复制链接 与好友分享!回本站首页
上一篇:Android NDK-Android强化课程笔记
下一篇:iOS项目之Swift新闻App侧栏菜单的实现
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站