【问题标题】:Update UI from a thread [duplicate]从线程更新 UI [重复]
【发布时间】:2019-10-11 02:16:23
【问题描述】:

我在尝试自动更新我的 android 活动中的视图时遇到了一些麻烦。 该应用程序显示一些消息,如聊天。我使用 ListView 将消息与 ArrayAdapter 放在一起。

我使用这个方法来更新 ListView

public void loadMessages() {
ArrayList<String> messages = this.dbHelper.getMessages();
conversationArrayAdapter.clear();
conversationArrayAdapter.addAll(messages);
conversationArrayAdapter.notifyDataSetChanged();
}

我的想法是放置一个调用该方法的线程,但是当我尝试这样做时,出现以下错误。

只有创建视图层次结构的原始线程才能接触其视图。

【问题讨论】:

  • 使用 AsyncTask 代替普通线程。
  • @User2121530 我放了一个线程,它会在 5 秒后重新加载你的 UI。检查我的答案。

标签: android android-ui


【解决方案1】:

因为您正试图从 Thread 访问或更新 UI 元素。为避免此错误,您将使用 runOnUiThread 从 Thread 更新 UI:

Your_Current_Activity.this.runOnUiThread(new Runnable() {

  @Override
    public void run() {

        // Update UI here    
        loadMessages();                             
    }
});

第二个解决方案是使用AsyncTask 而不是线程

【讨论】:

    【解决方案2】:

    使用此代码。

    public class MainActivity extends Activity
    {
        private Timer autoUpdate;
    
        @Override
         public void onResume()
         {
            super.onResume();
            autoUpdate = new Timer();
            autoUpdate.schedule(new TimerTask()
            {
                @Override
                public void run()
                {
                    runOnUiThread(new Runnable()
                    {
                        public void run()
                        {
                            updateScore();
                        }
                    });
                }
            }, 0, 5000); // updates each 5 seconds
         }
    
    
         @Override
         public void onPause()
         {
             autoUpdate.cancel();
             super.onPause();
         }
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            // initialize view layout
            super.onCreate(savedInstanceState);
            setContentView(R.layout.cleanermain);
            super.onResume();
        }
    
    
            private void updateScore()
            {
                // decide output
                // update cricket score
            }
    }
    

    【讨论】:

      【解决方案3】:

      UI 应该只从 UI(主)线程更新。 这是使用 AsyncTask 的解决方案。

      public void asyncCallWithSchedule() {
              final Handler handler = new Handler();
              Timer timer = new Timer();
              TimerTask doAsynchronousTask = new TimerTask() {
                  @Override
                  public void run() {
                      handler.post(new Runnable() {
                              public void run() {
                                  try {
                                      new SearchAsync().execute(txtSearch.getText().toString());
                                  }
                              });
                      }
                  };
                  timer.schedule(doAsynchronousTask, 0, 2000);
              }
      }
      

      AsyncTask 类:

      private class SearchAsync extends
      AsyncTask < String, Object, List < Users >> {
      
          @Override
          protected List < Users > doInBackground(String...params) {
              // Call DB here   
              return null;
          }
      
          @Override
          protected void onPostExecute(List < Users > result) {
              super.onPostExecute(result);
              // Update UI here
          }
      }
      

      【讨论】:

        【解决方案4】:

        简单:

        public void loadMessages() {
            ArrayList<String> messages = this.dbHelper.getMessages();
            conversationArrayAdapter.clear();
            conversationArrayAdapter.addAll(messages);
        
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                public void run() {
                    conversationArrayAdapter.notifyDataSetChanged();
                }
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-28
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多