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

Android 多线程编程

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

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条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章