1

ViewGroupと自動生成されたViewPagerの使用で問題が発生しました。ビューを追加してビューを削除したいのですが、試行するたびにエラーが発生します。

    01-20 14:05:40.028: E/AndroidRuntime(3615): FATAL EXCEPTION: AsyncTask #1
    01-20 14:05:40.028: E/AndroidRuntime(3615): java.lang.RuntimeException: An error occured while executing doInBackground()
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.lang.Thread.run(Thread.java:856)
    01-20 14:05:40.028: E/AndroidRuntime(3615): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:823)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.View.requestLayout(View.java:15468)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.View.requestLayout(View.java:15468)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.View.requestLayout(View.java:15468)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.View.requestLayout(View.java:15468)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.view.ViewGroup.removeView(ViewGroup.java:3524)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at de.tecfriends.vbtsplash2013.MainActivity$DummySectionFragment.Teilnehmer(MainActivity.java:219)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at de.tecfriends.vbtsplash2013.MainActivity$DummySectionFragment$1.onTaskCompleted(MainActivity.java:148)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at de.tecfriends.vbtsplash2013.BackgroundDownload.doInBackground(BackgroundDownload.java:38)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at de.tecfriends.vbtsplash2013.BackgroundDownload.doInBackground(BackgroundDownload.java:1)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    01-20 14:05:40.028: E/AndroidRuntime(3615):     ... 4 more

クラスではonCreateView、という名前のパブリックViewGroupを設定しvGroupます。すべてのデータ処理の最後にしようとしましvGroup.removeView(vGroup.findViewById(1));vGroup.addView(modeList);が、上記のエラーが発生しました。

original Threadこれにビューを追加および削除できる場所に到達するにはどうすればよいViewGroupですか?

4

3 に答える 3

2

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.非 UI スレッドであるバックグラウンド スレッドから UI 要素にアクセスしようとしていることを意味します。

vGroup.removeView()これら 2 つの関数は UI スレッドで実行されるため、onPreExecute()またはからのみ呼び出す必要があります。onPostExecute()

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

      @Override
      protected String doInBackground(String... params) {
            .... // runs on background / non-UI thread
      }      

      @Override
      protected void onPostExecute(String result) {   
            ... // runs on UI thread            
      }

      @Override
      protected void onPreExecute() {
            ... // runs on UI thread      
      }

      @Override
      protected void onProgressUpdate(Void... values) {
      }
}

AsyncTask のドキュメント

于 2013-01-20T13:21:02.547 に答える
1

vGroup.removeView()バックグラウンド スレッドから呼び出しています。UI を変更するには、常にUI Thread.

編集:上に作成しHandlerUIThread使用するmHandler.post(new Runnable());

于 2013-01-20T13:18:34.247 に答える