今天写了一个更新UI的小例子,没想到出了log打印了这样一个错误:Only the original thread that created a view hierarchy can touch its views。goolgle了一下找到了原因。
原来android中相关的view和控件不是线程安全的,我们必须单独做处理。这里借此引出Handler的使用。
Handler的官方描述:
A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue.
Each Handler instance is associated with a single thread and that
thread's message queue. When you create a new Handler, it is bound to
the thread / message queue of the thread that is creating it -- from
that point on, it will deliver messages and runnables to that message
queue and execute them as they come out of the message queue
.Handler的使用场合:
1、 to schedule messages and runnables to be executed as some point in the future;
安排messages和runnables在将来的某个时间点执行。
2、 to enqueue an action to be performed on a different thread than your own.
将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对
象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
通过Handler更新UI实例:
步骤:
1、创建Handler对象(此处创建于主线程中便于更新UI)。
2、构建Runnable对象,在Runnable中更新界面。
3、在子线程的run方法中向UI线程post,runnable对象来更新UI。
-
package djx.android;
-
-
import djx.downLoad.DownFiles;
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.os.Handler;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.Button;
-
import android.widget.TextView;
-
-
public class downLoadPractice extends Activity {
-
private Button button_submit=null;
-
private TextView textView=null;
-
private String content=null;
-
private Handler handler=null;
-
/** Called when the activity is first created. */
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
//创建属于主线程的handler
-
handler=new Handler();
-
-
button_submit=(Button)findViewById(R.id.button_submit);
-
textView=(TextView)findViewById(R.id.textView);
-
button_submit.setOnClickListener(new submitOnClieckListener());
-
}
-
//为按钮添加监听器
-
class submitOnClieckListener implements OnClickListener{
-
@Override
-
public void onClick(View v) {
-
//本地机器部署为服务器,从本地下载a.txt文件内容在textView上显示
-
final DownFiles df=new DownFiles("");
-
textView.setText("正在加载......");
-
new Thread(){
-
public void run(){
-
content=df.downLoadFiles();
-
handler.post(runnableUi);
-
}
-
}.start();
-
}
-
-
}
-
-
// 构建Runnable对象,在runnable中更新界面
-
Runnable runnableUi=new Runnable(){
-
@Override
-
public void run() {
-
//更新界面
-
textView.setText("the Content is:"+content);
-
}
-
-
};
-
-
-
}
转载自:http://blog.csdn.net/djx123456/article/details/6325983
阅读(743) | 评论(0) | 转发(0) |