Java GUI处理耗时任务的三种方法

第一种:Thread

new Thread(new Runnable() {

@Override

    public void run() {

//do your work

}

}).start();

// 更新主线程UI,跑在主线程。

runOnUiThread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

progressBar.setVisibility(View.GONE);

btn.setText("更新完毕!");

}

});

}

}).start();

}

});

其实这样的写法弊端很多...

1.new Thread新建线程性能差

2.线程缺乏统一管理, 可能无限制的新建线程,导致资源紧缺甚至oom

3.如若是匿名Thread类, 匿名类会隐式持有外部类,可能导致内存泄露;

第二种:AsyncTask(异步任务处理)

在使用AsyncTask时处理类需要继承AsyncTask,提供三个泛型参数,并且重载AsyncTask的四个方法(至少重载一个)。

三个泛型参数:

1.Param 任务执行器需要的数据类型

2.Progress 后台计算中使用的进度单位数据类型

3.Result 后台计算返回结果的数据类型

在设置参数时通常是这样的:String... params,这表示方法可以有0个或多个此类型参数;有时参数可以设置为不使用,用Void...即可。

四个方法:

1.onPreExecute() 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。

2.doInBackground(Params...) 后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress...)改变当前的进度值。

3.onProgressUpdate(Progress...) 运行于UI线程。如果在doInBackground(Params...) 中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。

4.onPostExecute(Result) 运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。

示例:

newAsyncTask() {

@Override

protectedObject doInBackground(Object... params) {

//LinkedList queue = new LinkedList();

//queue.addAll(list);

FindAddressManager findAddressManager =newFindAddressManager(mContext);

findAddress2(list, findAddressManager);

return null;

}

}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null,null);

第三种:线程池

//新建一个线程数为3的定长线程池

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

//执行

fixedThreadPool.execute(new Runnable() {

@Override

public void run() {

//xxx

}

});

第四种:Service

Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。

关于Service最基本的用法自然就是如何启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下。

public class MyService extends Service {

public static final String TAG ="MyService";

@Override

public void onCreate() {

super.onCreate();

Log.d(TAG,"onCreate() executed");

}

@Override

public int onStartCommand(Intent intent,int flags,int startId) {

Log.d(TAG,"onStartCommand() executed");

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

Log.d(TAG,"onDestroy() executed");

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

另外需要注意,项目中的每一个Service都必须在AndroidManifest.xml中注册才行

onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行。因此你可以再多点击几次Start Service按钮试一次,每次都只会有onStartCommand()方法中的打印日志。

IntentService

IntentService是系统提供给我们的一个已经继承自Service类的特殊类,IntentService特殊性是相对于Service本身的特性而言的:

1.默认直接实现了onBind(..)方法,直接返回null,并定义了抽象方法onHandlerIntent(..),用户自定义子类时,需要实现此方法;

2.onHandlerIntent(..)主要就是用来处于相应的”长期“任务的,并且已经自动在新的线程中,用户无语自定义新线程;

3.当”长期“任务执行完毕后(也就是onHandlerIntent(..)执行完毕后),此IntentService将自动结束,无需人为调用方法使其结束;

4.IntentService处于任务时,也是按照队列的方式一个个去处理,而非真正意义上的多线程并发方式。

下面是一个基本的继承自IntentService的自定义Service:

public class MyIntentService extends IntentService {

 

public static final String TAG = "MyIntentService";

 

     public MyIntentService() {

         super(TAG);

     }

     public MyIntentService(String name) {

         super(name);

     }

 

@Override

protected void onHandleIntent(Intent intent) {

Log.w(TAG, "in onHandleIntent");

Log.w(TAG, "thread name:" + Thread.currentThread().getName());

     }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值