2017-08-15 13 views
0

seprateスレッドからListViewにアクセスして設定したいのですが、そのオブジェクトのスコープが新しいスレッドにありません...その解決策は何ですか?サーバからデータを取得し、seprateスレッドでリストビューを表示

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

理想的には、Androidでやりたいスレッド操作のためのAsyncTaskを使用しています。それに最適化されたITとUIを更新するためのUI Threadメソッドを提供します。プラスこの方法では、あなたのアプリをクラッシュさせるバックグラウンドスレッドからUIを更新しようとしています。 –

答えて

0

以下のパターンに従うようにしてください。

MainThread(UIThread)にある必要があります。

アンドロイドのUIThreadの詳細とその動作については、このリンクをクリックしてください。

What is the Android UiThread (UI thread)

ただし、非同期に別のスレッドでロジックやIO操作を置くことができ、その後、あなたはUIスレッド上の結果を移入置くことができます。

1つの方法は、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

あなたはあなたのリストビュー用のアダプタを実装するために

はあなたが移入リストビュー/ RecyclerViewまたは別のスレッド上の他のビューまたはコンポーネントを取り込むことができません

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 –

関連する問題