2017-08-15 58 views
0

我想從分離線程訪問並填充ListView ...但它的對象在新線程中沒有它的作用域...它有什麼解決方案?從服務器獲取數據並在分離線程中顯示listview

ListView FilesListView; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    FilesListView= (ListView)findViewById(R.id.remoteFilesListView); 



new Thread (new Runnable() { 

     @Override 
     public void run() { 

    // fetch data from server… 
    String xmlFormServer = Worker.getXmlresponse(); 
    Log.d("Response from Serever", xmlFormServer; 


    // FilesListView object of Listview is not accessable in this thread to populate data… 
     } 
    }).start(); 

} 
+1

理想的情況下使用的AsyncTask爲您希望在Android中做線程操作。爲它優化的IT,並提供UI線程方法來更新您的用戶界面。此外,您正在嘗試從後臺線程更新UI,這會導致您的應用程序崩潰。 –

回答

0

模式不能填入填充的ListView/RecyclerView或在另一個線程上的任何其他視圖或組件。

這必須在MainThread(UIThread)上。

簽出此鏈接瞭解更多關於UIThread的信息,以及它的工作原理。

What is the Android UiThread (UI thread)

但是,你可以把不同的線程的邏輯或IO操作異步,然後你可以把填充在UI線程的結果。

一種方法是使用AsyncTask。

https://developer.android.com/reference/android/os/AsyncTask.html

事情是這樣的..

new AsyncTask<Void, Void, String >() { 

    // Runs on Worker thread 
    @Override 
    protected String doInBackground(Void... params) { 
     String xmlFormServer = Worker.getXmlresponse(); 
     return xmlFormServer; 
    } 

    // Runs on Ui thread 
    @Override 
    protected void onPostExecute(String data) { 
     if(data != null){ 
      adapter.setDate(data); 
      adapter.notifyDataSetChanged(); 
     } 

    } 
}.execute(); 
+0

裏面的可運行線程,我可以使用這個異步任務? – Zobi

+0

你不需要創建一個新線程,asynctask爲你創建一個新線程。在doInBackground()中做所有的事情都發生在工作線程上。請通過asynctask提供的鏈接。 – Ritesh

0

你應該實現適配器爲您的ListView

嘗試按照如下

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    FilesListView = (ListView) findViewById(R.id.remoteFilesListView); 

    adapter = new SimpleAdapter(/*...*/); // implement your custom adapter or use native 
//  1. set adapter into FileListView 
    FilesListView.setAdapter(adapter); 

    new AsyncTask<Void, Void, List>() { 

     @Override 
     protected List doInBackground(Void... params) { 
      String xmlFormServer = Worker.getXmlresponse(); 
      Log.d("Response from Serever", xmlFormServer; 

//    2. READ YOUR DATA HERE 

      List result = null; // 

//    3. send result to ui thread 
      return result; 
     } 

     @Override 
     protected void onPostExecute(List list) { 
//    the method executes on ui thread 
//    4. put your data into adapter 
//    you should implement the method or create native adapter 
      adapter.setDate(list); 
//    5. refresh list - only UI THREAD can do this 
      adapter.notifyDataSetChanged(); 
      super.onPostExecute(list); 
     } 
    }.execute(); 
} 
+0

我可以在可運行線程內使用這個新的AsyncTask 嗎? – Zobi

+0

你可以但你不需要。 https://developer.android.com/reference/android/os/AsyncTask.html –

相關問題