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");
}
}
解决方案 »
- java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.tencen
- ndk-build在libs/armeabi目录生成libxxx.so问题
- [求助PopupWindow] 菜鸟的popupWindow的问题,为什么显示不出来?
- JNI的线程/进程/内存空间疑问
- 读取网页内容,BufferedReader.readLine()始终返回null,同样代码在Java工程里面正常工作
- android搜索框架求解
- 有关三个广告的轮换问题?
- android下实现4分屏播放4路高清h264格式的rtsp流
- IOS和ANDROID哪个有开发前途?
- 音频缓存机制
- 在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的引用),这个检测机制在某个特定的条件下是不会检查的~