android 线程解析
来源:互联网 发布:调度流程的优化的意义 编辑:程序博客网 时间:2024/05/22 09:45
在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());
}
}
});
}
0 0
- Android 线程完全解析
- android 线程解析
- Android线程池解析
- Android进程与线程解析
- Android 线程Thread Runnable解析
- android addIdleHandler 空闲线程 解析
- Android线程池源码解析
- android 线程池源码解析
- Android--线程池实现方式解析
- java android ExecutorService 线程池解析
- Android--线程池实现方式解析
- 解析Android中线程的好处
- 解析Android中的main线程与子线程
- 解析Android中的main线程与子线程
- Android 中的线程及 AsyncTask(线程形态之一)解析一下
- 线程解析
- 线程解析
- Android线程模型解析(包括UI的更新)
- 合并字符串
- C++11 std::bind的用法(转)
- CSS 双斜线注解语法
- android 网络编程
- QT【绘图】 QPaintDevice 总结:QPixmap、QImage、QBitmap和QPicture
- android 线程解析
- JavaScript判断内容不为空,且不能只是空格
- Android UI 设计(13):AutoCompleteTextView
- java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag 解决方法
- centos6.5安装php5.6版本
- 九度考研真题 浙大 2008-2浙大 题目1029:魔咒词典 字符串比较
- (从头做DP)HDU 1025 Constructing Roads In JGShining's Kingdom
- ZOJ - 1633 Big String
- scala+java+eclipse+maven开发环境构建