background image

  mImageView.setImageBitmap( b );  //把图片设置给 ImageView

  }

     }).start()

  }

上面的代码会报错,你可能会说逻辑很正确啊,但是它违背了

Android 单线程模型:

Android UI 操作并不是线程安全的并且这些操作必须在 UI 线程中执行。

Andriod 提供了几种在其他线程中访问 UI 线程的方法:

Activity.runOnUiThread( Runnable )

View.post( Runnable )   

View.postDelayed( Runnable, long )

2.Handler

 

Handler 在 android 里负责发送和处理消息。它的主要用途有:

  

1)按计划发送消息或执行某个 Runnanble(使用 POST 方法);

  

2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新 UI 线

程)
  

 默认情况下,Handler 接受的是当前线程下的消息循环实例(使用

Handler

(

Looper

 

looper)

Handler

(

Looper

 looper, 

Handler.Callback

 callback)可以指定线程),同时

一个消息队列可以被当前线程中的多个对象进行分发、处理(在

UI 线程中,系统已经有一

Activity 来处理了,你可以再起若干个 Handler 来处理)。在实例化 Handler 的时候,

Looper 可 以 是 任 意 线 程 的 , 只 要 有 Handler 的 指 针 , 任 何 线 程 也 都 可 以
sendMessage。Handler 对于 Message 的处理不是并发的。一个 Looper 只有处理完一

Message 才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里

不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送

Message(通过

sendMessges 方法),然后由 handleMessage()更新 UI)。

3.Handler 与 Async Task 的区别

Handler 和 AsyncTask。其中 AsyncTask 比 hander 更轻量级一些。在 Android1.5 中提