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
版权声明:本文为博主原创文章,转载请附上博文链接!