在android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常,android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views. (只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)。)。
一般的做法是用handler机制,在子线程发一个Message个ui线程,然后线程获取message的数据更新ui控件数据。
这里着重要介绍的是第二个方案。就是activity的runOnUiThread(Runnable runnable)方法;要使用这个方法必须往子线程中传递activity引用context,和要更新的UI控件引用。
然后在子线程中实现更新逻辑,然后这个更新代码被加入到ui线程队列等待UI线程执行。
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
imageView.setImageBitmap(bitmap);
}
});
//根据下载url,下载图片更新imageview控件的工具类。
//传进去的参数有下载路径url,activity引用,imageview控件引用
public static void setPicBitmap(final String url, final Activity activity,
final ImageView imageView) {
new Thread() {
@Override
public void run() {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(
url).openConnection();
connection.connect();
InputStream iStream = connection.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(iStream);
// pic.setImageBitmap(bitmap);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
imageView.setImageBitmap(bitmap);
}
});
iStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}