Android中使用多线程处理UI相关内容时可能会发现Logcat提示Only the original thread that
created a view hierarchy can touch its
views这样的错误,这主要是Android的相关View和控件不是线程安全的,我们必须做独立的处理这点比J2ME麻烦一些,这里Android给我们提供了很多方法,有关线程的,我们需要了解下J2ME中一些传统的线程创建方法,比如Runnable或直接new
Thread(),大家需要了解UI线程、worker线程以及一些概念。
首先我们需要注意,主线程或者这里说的原始线程original thread
一般情况下是UI线程,当然UI线程并不一定是主线程,我们不能长时间的阻塞该应用,在Android平台上可能会产生类似Force
close或Wait这样的对话框这里我们成为ANR,这里除了使用ProgressDialog方式给用一个动态的进度代表当前处理并没有中断可能需要一些时间,所以android告诉大家相关的网络处理可以使用工作者线程,但是worker 线程不能处理显示元素即UI相关的View或
Widget包中的高层的控件(如果在worker线程中处理了UI的view,比如说显示TextView的内容等等,就会出现logcat中的错误),所以通过一个Handler对象可以很好的传递Runnable或Message
,下面我们用一个简单的例子来描述。
//定义一个pg
progressDialog = ProgressDialog.show(this, null, "正在读取数据...",
true,
false);
//开启work线程,请求网络数据,一个很费时间的I/O操作,比如网络或文件读写等等。
Thread thread = new Thread(new
Runnable() {
@Override
public void
run() {
initializeData();
uiHandler.sendEmptyMessage(0);
// 下载完成后发送处理消息给Handler,更新主线程
}
});
thread.start();
private Handler uiHandler = new Handler() {
public void
handleMessage(Message msg) {
Log.e(">>>>>Mhandler",
"开始handleMessage");
if (msg.what
== 0) {
buildContentView();
progressDialog.dismiss();
} else
{
Toast.makeText(LibNewsDetialActivity.this,
"下载文件失败,请检查网络连接",
Toast.LENGTH_SHORT).show();
}
}
};
加载中,请稍候......