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


    在跟随教程学习到显示web页面的html源码时报错:Only the original thread that created a view hierarchy can touch its views,通过网上查找资料得知:

    android中相关的view和控件不是线程安全的,必须单独做处理。如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。

    既然这样,我们就可以通过Handler对象实现对UI的更新。

      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。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_html);
    
    phtml=(EditText) findViewById(R.id.phtml);
    button1=(Button) findViewById(R.id.check_html);
    ihtml=(TextView) findViewById(R.id.ihtml);
    
    //创建属于主线程的handler 
    handler=new Handler();
    
    button1.setOnClickListener(new OnClickListener(){
    
    public void onClick(View v) {
    
    new Thread(){ 
    public void run(){ 
    try {
    String path=phtml.getText().toString();
    shtml=HtmlService.getHtml(path);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } 
    handler.post(runnableUi); 
    } 
    }.start(); 
    //new HtmlSourceAsync(ihtml).execute(path);
    }
    
    });
    }
    
    
    // 构建Runnable对象,在runnable中更新界面 
    Runnable runnableUi=new Runnable(){ 
    @Override 
    public void run() { 
    //更新界面 
    ihtml.setText(shtml); 
    } 
    
    };

    文章部分引自:http://blog.csdn.net/djx123456/article/details/6325983

  • 相关阅读:
    02.v-on的事件修饰符
    01.Vue的系统指令
    00-Vue的介绍和vue-cli
    vs code快捷键
    分库分表之后,主键的处理方法
    动态扩容分库分表
    前端web通过flask操作数据库-增删改查
    mysql组复制集群简介
    vsftp进阶-锁定目录
    kvm克隆
  • 原文地址:https://www.cnblogs.com/xiaoerlang90/p/4159933.html
Copyright © 2020-2023  润新知