子线程更新ui

When an Activity receives focus, it will be requested to draw its layout. The Android framework will handle the procedure for drawing, but the Activity must provide the root node of its layout hierarchy.

ui一般只有主线程才能更新,子线程何以直接更新ui,上面是官方文档提供的,要想重画界面,必须先提供根节点

其实在每次activity通过ui线程draw时,它都会记住当前ui线程,所以每次子线程调用更新ui时会报这样的错"Only the original thread that created a view hierarchy can touch its views."看下该异常抛出的源代码android.view.ViewRoot

    void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    }

mThread 代表主线程,当然子线程和主线程不等,所以抛出异常,所以子线程要想更新ui,必须确保你能获取viewroot.而WindowManagerImpl便符合条件,下面是一个简单的实例

 package sanjie.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;

public class UiandsonthreadtestActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  new Thread(new WorkThread()).start();

 }

 private class WorkThread implements Runnable {

  @Override
  public void run() {
             Looper.prepare();
   try {
    Thread.sleep(5000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   WindowManager manager = UiandsonthreadtestActivity.this
     .getWindowManager();
   TextView view = new TextView(UiandsonthreadtestActivity.this);
   view.setText("test");
   LayoutParams params = new LayoutParams();
   params.width=WindowManager.LayoutParams.WRAP_CONTENT;
   params.height=WindowManager.LayoutParams.WRAP_CONTENT;

   System.out.println("窗口对象是--------->"
     + UiandsonthreadtestActivity.this.getWindowManager());
   manager.addView(view, params);
   Looper.loop();
  }

 }
}

通过它便可以在子线程内更新ui了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值