谁说非UI线程不能更新View的?

立志做一个佳娃~ 2011-12-15 10:22:24
package NotUIThread_UpdateNotWrong.sonyChinaese.run;

import mythread.UpdateTextViewThread;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Main extends Activity {
private TextView textView1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView1 = (TextView) this.findViewById(R.id.textView1);

Log.v("!Main", "" + Thread.currentThread().getName() + " "
+ Thread.currentThread().getId());

UpdateTextViewThread mythread = new UpdateTextViewThread();
mythread.setTextView1(textView1);
mythread.start();

}
}


----------
package mythread;

import android.util.Log;
import android.widget.TextView;

public class UpdateTextViewThread extends Thread {

private TextView textView1;

public void setTextView1(TextView textView1) {
this.textView1 = textView1;
}

@Override
public void run() {
super.run();
Log.v("!run", "" + Thread.currentThread().getName() + " "
+ Thread.currentThread().getId());
textView1.setText("aaaaaaaaaaaaaaaaaaaa");
}


}
...全文
587 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
顶!顶!顶!顶!
兔子的博客 2012-11-24
  • 打赏
  • 举报
回复
不懂啊 最近被搞的头都大了
haoxiang12345 2012-11-24
  • 打赏
  • 举报
回复
可以看下源码 View 的线程检测机制在ViewRootIml类的checkThread()方法中,
void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    }
ViewRootIml是接口ViewParent的实现,它会在requestFitSystemWindows()、requestLayout()、invalidateChildInParent(int[] location, Rect dirty)、requestTransparentRegion(View child)、requestChildFocus(View child, View focused)、clearChildFocus(View child)、focusableViewAvailable(View v)、recomputeViewAttributes(View child)、playSoundEffect(int effectId)、focusSearch(View focused, int direction)、doDie()方法中进行检查的 View中大部分方法都是基于ViewParent(指向ViewRootIml的引用),这个检测机制在某个特定的条件下是不会检查的~
hanson339751607 2012-01-02
  • 打赏
  • 举报
回复
摆脱你的UpdateTextViewThread 也是UI线程,
你不会以为 UI线程就是看不见的吧

看不见的线程,但拥有的 View组件的也算 UI线程好不好。。。
CyberLogix 2012-01-02
  • 打赏
  • 举报
回复
可以但是会出现问题,因为View不是线程安全
freshui 2012-01-02
  • 打赏
  • 举报
回复
View不是线程安全的吧。会有data racing的问题。

多线程编程,最基本的问题就是同步加锁等解决data race。 当然data race的时候,大部分情况下不会死,也可能会做对,但由于两个线程间互相不知道对方对自己要管理的资源做了什么手脚,会出现很多奇怪的问题。
Marco_Lee 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 aomandeshangxiao 的回复:]

[/Quote]

大牛出现了,求详细解析啊~~
傲慢的上校 2012-01-01
  • 打赏
  • 举报
回复
star19678051 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xing376688 的回复:]

咋能说木有意义呢,可以增加对Activity的了解嘛。

我的理解是:非主线程可以对界面信息进行更新,但是不能进行刷新。在Activity执行完onResume()之前,界面实际上是没画好的,所以可以随便进行更新。执行完onResume()之后,界面就算画好了,这时候刷新界面的事情只能让ui线程干了。

对or错?
[/Quote]
这个答案比较贴近,我记得在一篇介绍handler looper messagequeue的文章中讲过,在OnCreate这个事件中其他线程是可以更新UI的,但在其他On中就一定会报错
Juniperus 2011-12-31
  • 打赏
  • 举报
回复
这么做,容易出现ANR。
sunsongyeah 2011-12-20
  • 打赏
  • 举报
回复
这个没看明白。。。
vane 2011-12-20
  • 打赏
  • 举报
回复
不能更新的意思并不是说用户更新不了,而是更新的时候有安全隐患。
打个比喻:你不能考试。 这并不是说你没有考试的能力,而是因为其他的原因而不准去考试。你个人再体会体会吧。
zhoujiaolongde 2011-12-20
  • 打赏
  • 举报
回复
用handler不行么? 我就是这么用的 就是在页面显示出来之后再来动态的改变ui 实际改变的代码还是放在ui线程里面
package com.hundsun.zhoujl.android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class TestUIChangeActivityActivity extends Activity {

private TextView tv = null;
private Handler handler = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView)findViewById(R.id.tv);
handler = new Handler() {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv.setText("Hello Handler");
}

};
Thread thread = new Thread() {

@Override
public void run() {
super.run();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}

};
thread.start();
}
}

充电宝111 2011-12-20
  • 打赏
  • 举报
回复
the Andoid UI toolkit is not thread-safe. So, you must not manipulate your UI from a worker thread
安卓android 2011-12-19
  • 打赏
  • 举报
回复




[Quote=引用 23 楼 seker_xinjian 的回复:]

[Quote=引用 20 楼 xing376688 的回复:]

咋能说木有意义呢,可以增加对Activity的了解嘛。

我的理解是:非主线程可以对界面信息进行更新,但是不能进行刷新。在Activity执行完onResume()之前,界面实际上是没画好的,所以可以随便进行更新。执行完onResume()之后,界面就算画好了,这时候刷新界面的事情只能让ui线程干了。

……
[/Quote]
半兽人写程序 2011-12-19
  • 打赏
  • 举报
回复
不死不代表不会死
不会死不代表一定不死
seker_xinjian 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xing376688 的回复:]

咋能说木有意义呢,可以增加对Activity的了解嘛。

我的理解是:非主线程可以对界面信息进行更新,但是不能进行刷新。在Activity执行完onResume()之前,界面实际上是没画好的,所以可以随便进行更新。执行完onResume()之后,界面就算画好了,这时候刷新界面的事情只能让ui线程干了。

对or错?
[/Quote]

正解,点名表扬!
安卓机器人 2011-12-16
  • 打赏
  • 举报
回复
肯定会报异常的,难道现在Android可以使用多线程更新UI控件了?
raphael55 2011-12-16
  • 打赏
  • 举报
回复
本来就是能更新view的啊。。
就是容易出现卡机现象。。
  • 打赏
  • 举报
回复
能跑吗? 很怀疑
加载更多回复(18)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧