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);
                }
        };
       
        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");

        Message message = handler.obtainMessage(); 
        message.arg1 = id;
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());
}
}
});
    }
       
     
0 0
原创粉丝点击