最近遇到一个错误,小错误,但有可能经常不注意的地方,我们都知道大多数情况下我们都是在子线程进行耗时操作,在主线程更新UI。因此我们有很多子线程耗时操作的东西出现(说了句废话); 我来说说我遇到的问题情况,
new Thread(new Runnable() {
@Override
public void run() {
String numgo = EDITGO.getText().toString().trim();
Log.w("Main", "num" + numgo);
if (numgo.equals("")) {
Toast.makeText(contextPub, "不能为空", Toast.LENGTH_SHORT).show();
} else {
String sOut = ComS2.ES_LotteryGoOut(Integer.valueOf(numgo));
DuihuakuangShow(sOut);
}
}
}).start();
貌似上面的问题没有错 ,上面代码的意思很简单,就是我开启一个子线程,然后拿到输入框的值,进行非空的判断,然后Toast提示一下,不为空执行我的一串口的耗时操作。整体下来没毛病啊老铁,初级程序员啊。。。。。。。。。。。。
因为我们在子线程,不能执行Ui主线程。。。toast是在主线程显示的东西。。。。。。所以............、
解决办法使用
runOnUiThread(new Runnable() { @Override public void run() {
在这使用Toase
} });
runOnUiThread 看这个东西 单看名就能理解了 run(这个东西) on (回到 ) UI (ui) Thread (线程) 回到主线程Ui线程执行动作,哈哈,我是这么理解的,正确的代码
new Thread(new Runnable() {
@Override
public void run() {
String numgo = EDITGO.getText().toString().trim();
Log.w("Main","num"+numgo);
if(numgo.equals("")){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(contextPub,"不能为空",Toast.LENGTH_SHORT).show();
}
});
}else {
String sOut = ComS2.ES_LotteryGoOut(Integer.valueOf(numgo));
DuihuakuangShow(sOut);
}
}
}).start();
runonUIThread 只不过是其中一种 你也可能开启Handler 执行 ,
其实把问题用大白话说就是 子线程执行耗时操作,主线程执行刷新UI.你要使用那个工具回到主线程执行Ui刷新就可以了