0

スレッドを使用してListViewアダプターの値を変更しようとしましたが、CalledFromWrongThreadExceptionという例外がスローされます。View要素の値を変更するスレッドを呼び出すことはできますか?これが私のコードです:

new Thread(new Runnable(){

    public void run() 
    {
        ap=(ArrayList<Application>) getBoughtApps(android_id);
        adapter1 = new MyCustomAdapter(ap);
        listView = ( ListView ) MainActivity.this.findViewById(R.id.listview);
            changeAdapter();    
    }
}).start();
4

2 に答える 2

3

最初のオプション:

非UiスレッドからUIを更新するにはrunOnUiThreadを使用します。コードを次のように変更します。

new Thread(new Runnable(){

    public void run() 
    {
      ap=(ArrayList<Application>) getBoughtApps(android_id);
       Current_Activity.this.runOnUiThread(new Runnable() {
         public void run() {

           adapter1 = new MyCustomAdapter(ap);
           listView = ( ListView ) MainActivity.this.findViewById(R.id.listview);
           changeAdapter(); 
          //Your code here..
         }
       });

    }
}).start();


2番目のオプション:

ネットワーク操作を行うため、またはアプリケーションがバックグラウンドからUiを更新する必要がある場合は、スレッドの代わりにAsyncTaskを使用できます。次のように使用して、現在のコードを変更できますAsyncTask

private class CallwebTask extends AsyncTask<Void, Void, String>
{

    protected ArrayList<Application> doInBackground(String... params) 
    {
        ap=(ArrayList<Application>) getBoughtApps(android_id);
        return ap; // Return ArrayList<Application>
    }

    protected onPostExecute(ArrayList<Application> result) {
        Log.i("OnPostExecute :: ", String.valueOf(result.size()));
        //Put UI related code here
        adapter1 = new MyCustomAdapter(result);
        listView = ( ListView ) MainActivity.this.findViewById(R.id.listview);
        changeAdapter(); 
    }
}

AsyncTaskスレッドを開始する場所にこの行を配置し始めます。

new CallwebTask().execute();

于 2012-11-13T14:13:06.737 に答える
1

ビューには、UIスレッドからのみアクセスできます。runonUIThreadブロックから同じことを試すことができます

runOnUiThread(new Runnable() {
    public void run() {
          ap=(ArrayList<Application>) getBoughtApps(android_id);
        adapter1 = new MyCustomAdapter(ap);
        listView = ( ListView ) MainActivity.this.findViewById(R.id.listview);
            changeAdapter();   
    }
});
于 2012-11-13T14:12:55.267 に答える