2017-08-15 60 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 –

相关问题