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

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

  • java.lang.RuntimeException:无法在未调用Looper.prepare()的线程中创build处理程序;
  • Asynctask与线程vs服务与加载器
  • Android的SQLite查询,插入,更新,删除,总是需要在后台线程?
  • Android处理程序 - 线程间通信
  • Android 4.0 asynctask在同一时间不可能
  • 如何等待线程在另一个线程启动Java / Android之前完成?
  • 使用处理程序发布到UI线程
  • 我可以将不同types的parameter passing给Android中的AsyncTask吗?
  • 如果您不想使用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 } } 

    谢谢你们。