方法1:创建单独的线程
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Doingwork();
}
}).start();
方法2:利用线程池:
private ExecutorService executorService = Executors.newFixedThreadPool(4);
上面是创建一个固定大小的线程池,这里面的线程不会被关闭,一旦有任务则会分配给线程,但是如果线程都在执行,则排队等候
private ExecutorService executorService = Executors.newCachedThreadPool();
这样则是创建一个缓存的线程池,线程被创建之后不会立即被销毁,而是作为备用线程缓存在那里,当一个任务结束之后马上又有第二个任务,这个线程就会去执行第二个任务,省去了创建线程和销毁线程的步骤,节省开销
将任务投入线程池的方法:
executorService.submit(work);
其中的work是Runnable类
任务需要这样写:
Runnable work = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Doingwork();
}
};
线程中操作UI的方法
方法之一是handler:
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
UIWork();
}
}
};
msg是为了区分不同的UI操作,比如点这个按钮就改变这个label,点那个按钮就改变那个图片,需要写不同的message
下面是线程中的操作:
Message message = new Message();
message.what=1;
handler.sendMessage(message);
这样的话UIWork()就会在主线程中完成,而不是在创建的线程中,因此不能在handler中执行耗时任务