温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

安卓多线程#2--如何使用类AsyncTask实现异步耗时操作

发布时间:2020-06-26 01:22:26 来源:网络 阅读:834 作者:MEMORY_YI_1 栏目:开发技术

上一篇博文讲述了ANR异常以及使用handler类解决异常。这次我将给大家介绍另外一种处理耗时操作的方法。异步处理耗时操作是当时比较流行的方法,所以能完全掌握此类的使用是非常重要。至于为什么会流行,下面我就先给大家介绍使用AsyncTask的好处

1:使用AsyncTask的好处

当我们处理耗时操作时候,比如下载这时候我们就要启动一个线程,假设我们有几百条线程要启动。我给大家举个例子。线程启动就像扫把,启动一个就等于一把新扫把,当我们用完的时候就丢掉,等到下次再用的时候就在买一把新扫把,如此循环。这样就等于浪费资源而使用AsyncTask就想一个放10几个扫把的地方。每次我们用了扫把后就放回去,等下次某个人需要用的时候继续循环使用这个扫把,这样以来就节省了系统资源。现在大家知道AsyncTask类的好处了吧,能节省系统资源对我们做好一个大项目来说是至关重要的。

2:AsyncTask的使用。

(1):我给大家做个例子,有一个进度条,一个文本,一个按钮启动下载,当点击下载时候文本就会根本当前进度条进度显示百分比的进度,如下图

安卓多线程#2--如何使用类AsyncTask实现异步耗时操作

(2):写一个内部类继承AsyncTask,其实第一个方法是必须实现的,后面2个是我手动调用的,具体代码如下

class MyTask extends AsyncTask<String, Integer, String>
{
    @Override
    protected String doInString...  params) {
        publishProgress(values);
        return null;
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
}

首先这个类需要有3个类型,第一个params类型就是等会我们启动线程池需要传入的参数类型,一般都是传入网址,所以我定义它为String类型,当此类型定义完成后,doInBackgroud方法中的参数类型就是同样是String类型(doInBackground方法想当于线程的run方法,是在子线程处理的)。它会获得我们传入的网址参数。第二个Progress类型就是我们在处理耗时操作过程中如果需要处理主线程的东西时候,就可以在doInBackground方法中调用publishProgress(values)方法激活第二个重写的方法onProgressUpdate()方法(这个方法是在main线程中的执行的因此可以操作UI对象.values一般都是传入进度参数。第三个参数就是当我们处理好了doInBackgroud的方法,他会返回一个结果,这个结果的类型,这里我给它定义为String,这时候doInBackgroud方法返回值自动变为String类型

然后第三个方法onPostExecute就会接受到doInBackgroud返回的结果值

(3):在鉴定匿名类里面我们就启动这个线程池,由于之前我定义了启动线程池传入的参数为String类型,所以现在我就传入了一个String,代码如下:(这里这个参数目前没用只是为了说明前面的问题


new MyTask().execute("www.baidu.com");


(4):然后在doInBackgroud方法处理进度(这里设定每100毫秒增加一个进度然后调用publishProgress()方法来在主线程增加进度条进度和更新文本百分比进度),代码如下

@Override
protected String doInString...  params) {
    //没100毫秒进度+1,总共执行100次
    for (int i = 0; i < 100; i++) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //激活onProgressUpdate并将进度i传入
            publishProgress(i);
        }
    return "下载完成";
}
                                                                                                                              
@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    //更新进度条进度
    mProgressBar.setProgress(values[0]);
    //更新百分比进度
    mTextView.setText(values[0]+"%");
}

(4):当下载完成以后我们在onPostExecute()方法中将文本内容更新为下载完成

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    mTextView.setText(result);
}

大功告成。这就是使用AsyncTask类实现异步耗时操作的用法,我会吧这次程序的完整代码上传到我的上传,大家如果有需要的话可以去下载,下一次我会结合ListView和AsyncTask做一个下载歌曲的小项目


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI