【发布时间】:2011-09-07 13:54:52
【问题描述】:
有没有办法在非 UI 线程中进行 UI 更改?简短的问题。
【问题讨论】:
标签: java android multithreading user-interface
有没有办法在非 UI 线程中进行 UI 更改?简短的问题。
【问题讨论】:
标签: java android multithreading user-interface
使用Handler 或使用以下代码
runOnUiThread(new Runnable()
{
@Override
public void run()
{
// Ui Stuff here
}
});
【讨论】:
有很多方法可以做到这一点,使用AsyncTask or Threads。简短的回答。
提示:UI 的东西可以在 pre-postExecute/runOnUiThread/Handler 类中完成
【讨论】:
如果您不想使用 AsyncTask,请在您的主要活动中尝试使用内部类 (ResponseHandler) 的观察者模式,抱歉我无法正确设置格式,但我确定您明白了
public class WorkerThread extends Observable implements Runnable {
public void run() {
try {
DoSomething();
String response = "Doing something";
setChanged();
notifyObservers( response );
DoSomethingElse();
String response = "Doing something else";
setChanged();
notifyObservers( response );
}
catch (IOException e) {
e.printStackTrace();
}
}
private void DoSomething(){
}
private void DoSomethingElse(){
}
public class MainActivity{
public class ResponseHandler implements Observer {
private String resp;
public void update (Observable obj, Object arg) {
if (arg instanceof String) {
resp = (String) arg;
//Write message to UI here ie System.out.println("\nReceived Response: "+ resp );
//or EditText et = (EditText)findViewById(R.id.blah);
// blah.SetText(resp);
}
}
}
private void doStuffAndReportToUI(){
final WorkerThread wt = new WorkerThread();
final ResponseHandler respHandler = new ResponseHandler();
wt.addObserver( respHandler );
Thread thread = new Thread(wt);
thread.start();
}
【讨论】:
【讨论】:
【讨论】:
我试过 +tmho 答案,但它仍然给出这个错误:
E/AndroidRuntime(****): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。
我最终将它与 +ingsaurabh 方式结合起来,就像这样:
private class ResponseHandler implements Observer, Runnable {
Activity act;
public ResponseHandler(Activity caller) {
act = caller;
}
@Override
public void update (Observable obj, Object arg) {
act.runOnUiThread(this);
}
@Override
public void run() {
//update UI here
}
}
谢谢你们。
【讨论】: