2

doInBackground (ロード画面用) で XML 解析を使用してから、listview(list) で LazyAdapter を使用して設定しています。

最初のコードサンプル:

public class NewCoupons extends Activity {

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
             
        bar = (ProgressBar) this.findViewById(R.id.bar);
        new ProgressTask().execute();
}

private class ProgressTask extends AsyncTask <Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... arg0) {   
          .....
          list=(ListView)findViewById(R.id.list);
          adapter = new LazyAdapter(this, xy);        
          list.setAdapter(adapter);
        }
}
}

「NewCoupons.this」を使用すると、次のようになります。

05-15 21:01:16.553: E/AndroidRuntime(6319): 致命的な例外: AsyncTask

1 05-15 21:01:16.553: E/AndroidRuntime(6319): java.lang.RuntimeException: 実行中にエラーが発生しました

doInBackground() 05-15 21:01:16.553: E/AndroidRuntime(6319): で

android.os.AsyncTask$3.done(AsyncTask.java:299) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

java.util.concurrent.FutureTask.setException(FutureTask.java:219)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

java.util.concurrent.FutureTask.run(FutureTask.java:239) 05-15

21:01:16.553: E/AndroidRuntime(6319): で

java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

java.lang.Thread.run(Thread.java:856) 05-15 21:01:16.553:

E/AndroidRuntime(6319): 原因:

android.view.ViewRootImpl$CalledFromWrongThreadException: のみ

ビュー階層を作成した元のスレッドは、そのビューに触れることができます。

05-15 21:01:16.553: E/AndroidRuntime(6319): で

android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746) 05-15

21:01:16.553: E/AndroidRuntime(6319): で

android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:823) 05-15

21:01:16.553: E/AndroidRuntime(6319): で

android.view.View.requestLayout(View.java:15473) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

android.view.View.requestLayout(View.java:15473) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

android.view.View.requestLayout(View.java:15473) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

android.view.View.requestLayout(View.java:15473) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

android.view.View.requestLayout(View.java:15473) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

android.widget.AbsListView.requestLayout(AbsListView.java:1819) 05-15

21:01:16.553: E/AndroidRuntime(6319): で

android.widget.ListView.setAdapter(ListView.java:490) 05-15

21:01:16.553: E/AndroidRuntime(6319): で

com.example.androidhive.NewCoupons$ProgressTask.doInBackground(NewCoupons.java:170)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

com.example.androidhive.NewCoupons$ProgressTask.doInBackground(NewCoupons.java:1)

05-15 21:01:16.553: E/AndroidRuntime(6319): で

android.os.AsyncTask$2.call(AsyncTask.java:287) 05-15 21:01:16.553:

E/AndroidRuntime(6319): で

java.util.concurrent.FutureTask.run(FutureTask.java:234) 05-15

21:01:16.553: E/AndroidRuntime(6319): ... 3 つ以上

問題:新しい LazyAdapter で "this" を使用できないことです。これはエラーになります。新しいLazyAdapterで「これ」に何を設定する必要がありますか?

ありがとう。

4

2 に答える 2

2

コンテキストを渡す必要があります。つまり、これを行うことができます:MyClassName.thisまたはgetActivity()、フラグメント内にいる場合。

編集:

エラーは次のとおりです。

ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

于 2013-05-15T20:58:25.407 に答える
1

アクティビティが MainActivity と呼ばれる場合、 MainActivity.this を使用します

于 2013-05-15T21:00:24.557 に答える