我们如何在Android中使用runOnUiThread?
我是Android新手,我正在尝试使用UI线程,所以我写了一个简单的测试活动。 但我想我误解了一些东西,因为点击按钮 - 应用程序不再响应
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
下面是更正的runThread
函数的片段。
private void runThread() {
new Thread() {
public void run() {
while (i++ < 1000) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText("#" + i);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
把它作为一个函数包装起来,然后从你的后台线程中调用这个函数。
public void debugMsg(String msg) {
final String str = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(str);
}
});
}
你有它回到前面。 您的按钮点击会导致对runOnUiThread()
的调用,但这不是必需的,因为点击处理程序已经在UI线程上运行。 然后, runOnUiThread()
代码启动一个新的后台线程,尝试执行UI操作,然后失败。
相反,直接从您的点击处理程序启动后台线程。 然后,在对btn.setText()
的调用中将调用包装到runOnUiThread()
。
上一篇: How do we use runOnUiThread in Android?
下一篇: android.os.NetworkOnMainThreadException sending an email from Android