在android 系统中,多线程的使用使的程序的执行和效率有了很大的提高,同时也使用户体验有了明显改善。接下来,让我们了解下android中线程的使用方法。
当你的应用被执行时,系统会默认的创建一个线程,这个线程就是为了启动UI界面线程。我们一般称这个线程为主线程。主线程主要是进行
android.widget和 android.view包中的组件交互动作。我们的on开头的(onCreate、onStar、onResume...)等是在主线程执行。这里需要特别提醒的是,任何费时的操作(下载图片等)都会引起系统的ANR(Activity Not Response)错误。这里就需要我们开启子线程来完成这些操作。
1、handler+Thread+线程之间的通信
下面用一个程序来解释:
final Handler handler2 = new Handler() {//handler 是线程之间通信机制,主要是对消息的处理
@Override
public void handleMessage(Message msg) { //收到线程返回的消息内容并处理
((ImageView) MainActivity.this.findViewById(msg.arg1))
.setImageDrawable((Drawable) msg.obj);
}
};
@Override
public void handleMessage(Message msg) { //收到线程返回的消息内容并处理
((ImageView) MainActivity.this.findViewById(msg.arg1))
.setImageDrawable((Drawable) msg.obj);
}
};
public void loadimageurl(final String url, final int id){ //这是一个图像下载函数
Thread thread =new Thread(){
public void run() {
//这里执行耗时操作
final Drawable drawable = Drawable.createFromStream(
new URL(url).openStream(), "image.png");
new URL(url).openStream(), "image.png");
Message message = handler.obtainMessage();
message.arg1 = id;
message.obj = drawable;
message.obj = drawable;
handler.sendMessage(message); //将带有内容的消息传回主线程
}
};
thread.start();
}
2、线程池的使用
线程池的思想与对象池一致,我们开辟一块空间来存放线程对象,每当我需要使用线程的时候,我们就从线程池 里取线程对象,每次使用完线程对象之后,线程对象就回归线程池。这样就可以避免系统每次都要构建线程。有效节约了系统“资源”。使用方法如下:
private Handler handler = new Handler();
private ExecutorService excutorService = Executors.newFixedThreadPool(2);//定义一个有两个线程的线程池
public void loadimageurl(final String url, final int id) {
excutorService.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
final Drawable drawable = Drawable.createFromStream(
new URL(url).openStream(), "image.png");
if (drawable != null)
handler.post(new Runnable() { //这种方法可以实现在子线程里更新Ui界面,也可以 //用消息模式来实现UI界面更新。注:子线程不可以更新UI界面。
@Override
public void run() {
// TODO Auto-generated method stub
((ImageView) MainActivity.this.findViewById(id))
.setImageDrawable(drawable);
}
});
} catch (IOException e) {
Log.d("test", e.getMessage());
}
}
});
}
excutorService.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
final Drawable drawable = Drawable.createFromStream(
new URL(url).openStream(), "image.png");
if (drawable != null)
handler.post(new Runnable() { //这种方法可以实现在子线程里更新Ui界面,也可以 //用消息模式来实现UI界面更新。注:子线程不可以更新UI界面。
@Override
public void run() {
// TODO Auto-generated method stub
((ImageView) MainActivity.this.findViewById(id))
.setImageDrawable(drawable);
}
});
} catch (IOException e) {
Log.d("test", e.getMessage());
}
}
});
}