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");
}
}
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");
}
}
解决方案 »
- 模拟http登陆遇到的编码问题
- quickmark二维码扫描开发
- [ Help ] Android Screen size issue
- (求救!!)解析xml的getTextContent()方法在android开发中不可以用?
- 在android上浏览html页面, 能不能不写java代码,就用js代码使用ajax?
- android调用高德地图(或者其他程序),后台线程弹出框处理
- 豆瓣网android的手机端 后台服务
- 调一个android项目
- ListView 每一项添加数目不等的android控件不成功,求帮忙看下。
- Androidannotation 的问题
- 在oncreate()方法中handler的post先执行再显示界面?why
- Android 调用百度 sdk 定位问题
就是容易出现卡机现象。。
贴上测试代码:
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
new Thread() {
public void run() {
super.run();
TextView tx = (TextView) findViewById(R.id.textView);
tx.setText("lllllllllllllllllllll");
} }.start(); Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread() {
public void run() {
super.run();
TextView tx = (TextView) findViewById(R.id.textView);
tx.setText("2222222222222");
} }.start();
}
});
}
但是在操作的过程中,比较容易发生异常,而导致程序变得很卡(变得很卡是没有调试器连接的情况,如果程序是在调试状态运行,那么这个时候eclipse会告诉你发生了CalledFromWrongThreadException),这个概率么,说不上来,但是如果后台线程如果是循环执行这个访问操作就很容易遇到。
像楼主这种只执行一次的情况,遇到的概率不高。
// TODO Auto-generated method stub super.onStart(); TextView tx = (TextView) findViewById(R.id.textView);
tx.setText("aaaaaaaaaaa"); new Thread() {
public void run() {
super.run();
TextView tx = (TextView) findViewById(R.id.textView);
for (int i = 0; i < 3; i++) {
tx.setText("lllllllllllllllllllll" + i);
} } }.start(); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread() {
public void run() {
super.run();
TextView tx = (TextView) findViewById(R.id.textView);
tx.setText("2222222222222");
} }.start();
}
});
}结论一样,只有在点击按钮之后才报错
nonono,当我点击按钮之后是100%报错的
runOnUiThread(new Runnable{
public void run(){
text.setText("---");
}
});有区别吗 ??
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();
}
}
你不会以为 UI线程就是看不见的吧看不见的线程,但拥有的 View组件的也算 UI线程好不好
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的引用),这个检测机制在某个特定的条件下是不会检查的~