【问题标题】:Do some Android UI stuff in non-UI thread在非 UI 线程中做一些 Android UI 的事情
【发布时间】:2011-09-07 13:54:52
【问题描述】:

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

【问题讨论】:

    标签: java android multithreading user-interface


    【解决方案1】:

    使用Handler 或使用以下代码

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          【讨论】:

          • 嗯,基本问题是,该线程在我的主要活动之外的其他类中,并且它在无限循环中做某事(套接字等)。
          【解决方案5】:
          【解决方案6】:

          我试过 +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
              }
          }
          

          谢谢你们。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多