您的位置:首页 > 其它

Only the original thread that created a view hierarchy can touch its views——Handler的使用

2013-06-10 18:04 381 查看
今天写了一个更新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。

详细代码如下:

[java]
view plaincopy

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("http://192.168.75.1:8080/downLoadServer/a.txt");

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

}

};

}

*java线程的详细讲解链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐