当前位置: 代码迷 >> 综合 >> 错误:Only the original thread that created a view hierarchy can touch its views——Handler的使用
  详细解决方案

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

热度:84   发布时间:2024-02-13 05:12:58.0

今天写了一个更新UI的小例子,没想到出了log打印了这样一个错误:Only the original thread that created a view hierarchy can touch its views。google了一下找到了原因。

原来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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//创建属于主线程的handlerhandler=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{@Overridepublic 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() {@Overridepublic void run() {//更新界面textView.setText("the Content is:"+content);}};}

java线程的详细讲解链接

  相关解决方案