在非UI线程中做一些Android UI的东西

有没有办法在非UI线程中进行UI更改? 简短的问题。

Solutions Collecting From Web of "在非UI线程中做一些Android UI的东西"

如果您不想使用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(); } 

请使用Handler或使用下面的代码

  runOnUiThread(new Runnable() { @Override public void run() { // Ui Stuff here } }); 

有很多方法可以做到这一点,使用AsyncTask或线程 。 简短的回答。

提示:UI的东西可以在postExecute / runOnUiThread / Handler类中完成

检查Handler类。 或者看看这些类似的问题:

从线程更新UI

从线程处理UI代码

使用audiotrack从线程更新ui

我试过+ tmho的答案,但它仍然给这个错误:

E / AndroidRuntime(****):android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创build视图层次结构的原始线程可以触及其视图。

我最终以+ 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 } } 

谢谢你们。