您现在的位置是:首页 > 文章详情

Android 多线程编程

日期:2019-07-03点击:399

Android 多线程编程
文章目录
线程的调用
实现Runnable接口定义一个线程
使用匿名内部类的方法启动子线程
在子线程中更新主线程参数
异步信息处理机制
使用异步信息处理机制
解析异步信息处理机制
AsyncTask
使用AsyncTask
线程的调用
实现Runnable接口定义一个线程
class MyThread implements Runnable
{

@Override public void run() { //处理具体的逻辑 }

}

启动MyThread

MyThread myThread = new MyThread();
new Thread(myThread).start();
1
2
使用匿名内部类的方法启动子线程
new Thread(

new Runnable() { @Override public void run() { //处理具体的逻辑 } }

).start();

在子线程中更新主线程参数
子线程不能直接修改主线程中的变量,否者会出现异常。

异步信息处理机制
使用异步信息处理机制
首先定义一个整形常量UPDATE_DATA。

public static final int UPDATE_DATA = 1;
1
新增一个Handler对象,并重写父类的handleMessage()方法。

private Handler handler = new Handler()
{

public void handleMessage(Message msg) { switch (msg.what) { case UPDATE_DATA: //这里可以进行主线程中的变量操作 break; default: break; } }

}

在单击事件中开启子线程,在“具体的逻辑”执行完成后,创建一个Message对象,将Message对象的what字段的值指定为UPDATE_DATA,将Message对象发送出去。
很快,Handler就会收到这条Message,并在handleMessage()方法中对它进行处理。

new Thread(

new Runnable() { @Override public void run() { //处理具体的逻辑 Message message = new Message(); //创建一个Message对象 message.what = UPDATE_DATA; //将Message对象的what字段的值指定为UPDATE_DATA handler.sendMessage(message); //将Message对象发送出去 } }

).start();

解析异步信息处理机制
AsyncTask
对于在子线程中使用主线程中的变量,Android提供了一个更方便的工具:AsyncTask。
即使对异步消息处理机制完全不了解,也可以十分简单的从子线程切换到主线程。

使用AsyncTask
AsyncTask是一个抽象类,在继承时我们可以为AsyncTask类指定3个泛型参数。
Params:在执行AsyncTask时,需要传入的参数,可用于在后台任务中使用
Progress:后台任务执行时,如果需要再界面上显示当前进度,则使用这里指定的泛型作为进度单位。
Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

//Void:表示在执行AsyncTask的时候不需要传入参数给后台任务
//Integer:表示使用整型数据来作为进度显示单位
//Boolean:表示使用布尔型数据来反馈执行结果
class DownloadTask extends AsyncTask
{

...

}

重写AsyncTask中的几个方法,完成对任务的定制
doInBackground():中执行具体的耗时任务
onProgressUpdate():中进行主线程变量操作
onPostExecute():中做执行一些任务的收尾工作

class DownloadTask extends AsyncTask
{

@Override protect void onPreExecute() { /* *这个方法会在后台任务开始执行之前调用, *用于进行一些界面上的初始化操作, *比如显示一个进度条对话框等。 */ } @Override protect Boolean doInBackground(Void ... params) { /* *这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有耗时任务。 *任务一旦完成,就可以通过return语句来将任务的执行结果返回。 *如果AsyncTask的第三个泛型参数指定的是Void,则可以不返回任务执行结果。 * *在这个方法中不可以对主线程的变量进行操作。 */ //用于调用opProgressUpdate()方法 publishProgress(Progress ...); } @Override protect void onProgressUpdate(Integer ... values) { /* *当后台任务中调用了publishProgress(Progress ...)方法后, *onProgressUpdate(Progress ...)方法很快就会被调用。 *该方法中携带的参数是在后台任务中传递过来的。 * *在这个方法中可以对主线程的变量进行操作。 */ } @Override protect void onPostExecute(Boolean result) { /* *当后台任务执行完毕,并通过return语句进行返回时, *这个方法很快就会被调用。 *返回的数据会作为参数传递到此方法中, *可以利用返回的数据做一些对主线程变量的操作。 */ }

}

如果想要启动这个任务,只需要编写以下代码即可:

new DownloadTask().execute();

作者:zzsj1990
来源:CSDN
原文:https://blog.csdn.net/zzsj1990/article/details/90767742
版权声明:本文为博主原创文章,转载请附上博文链接!

原文链接:https://yq.aliyun.com/articles/707442
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章