2013-03-01 171 views
-3

我在嘗試更新automaticaly視圖中的android活動時遇到了一些麻煩。 應用程序顯示一些消息,如聊天。我使用ListView將消息與ArrayAdapter一起使用。從線程更新UI

我用這個梅託德更新的ListView

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

我的想法是把調用該梅託德一個線程,但是當我嘗試這樣做,我有以下錯誤。

只有創建視圖層次結構的原始線程才能觸及其視圖。

+2

使用的AsyncTask,而不是一個正常的線程。 – hardartcore 2013-03-01 12:42:12

+0

您可以嘗試使用異步任務。 這裏是例如: [異步任務] [1] [1]:http://stackoverflow.com/questions/14607053/update-data-to-server-in-the -background-android/14607791#14607791 – 2013-03-01 12:44:58

+2

搜索之前問。 – njzk2 2013-03-01 12:53:24

回答

0

您必須使用自己的主題。這裏是使用AsyncTask的解決方案....

將所有代碼放入您的Activity類。

public void toCallAsynchronous() { 
       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 { 


    //ASYNC TASK OBJECT CALL EVERY 2 SECOND     
    AutoPretraga zadatak = new AutoPretraga(); 
    zadatak.execute(txtPretraga.getText().toString()); 


          } 
         }); 
        } 
       }; 
timer.schedule(doAsynchronousTask, 0, 2000); // execute in every 2 second 

      } 

的AsyncTask類.....

private class AutoPretraga extends 
       AsyncTask<String, Object, List<Korisnici>> { 

      @Override 
      protected List<Korisnici> doInBackground(String... params) { 
    //DONT TOUCH GUI OBJECT IN THIS FUNCTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    //CALL DATABASE IN THIS FUNCTION    


     return null; 

      } 

      @Override 
      protected void onPostExecute(List<Korisnici> result) { 


       super.onPostExecute(rezultat); 


       //IN THIS FUNCTION YOU HAVE RESUT FROM DATABASE 
         //AND YOU CAN CHANGE GUI 

      } 

     } 
1

因爲您試圖從線程訪問或更新UI元素。爲了避免這種錯誤,你會MEED使用runOnUiThread從線程更新UI爲:

Your_Current_Activity.this.runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 

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

和第二種解決方案是使用AsyncTask而不是線程

1

使用此代碼。

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 
     } 
} 
0

簡單:

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(); 
     } 
    }); 
}