0

viewpager内にフラグメントを作成しようとしています。アダプターでは、スレッドを使用してフラグメントを作成しています。スレッド内で、フラグメントをさらにフェッチするAsyncTaskを実行しています。各フラグメントクラス(OneFragment、TwoFragment)内には、WebからAPIにアクセスするAsyncTaskがあります。スレッドとAsyncTaskをまったく使用していない場合、アプリケーションは正常に機能します。UIのパフォーマンスをスムーズにするためにこれを使用しています。しかし、それはフェッチエラーです。私は同じ問題についていくつかの既存のトピックを通過しました。しかし、私はこれの理由を理解することができませんでした。ここで私が間違っていることを誰かが指摘できますか?

これが私のアダプタクラスとAsyncTaskクラスです:

class SectionsPagerAdapter extends FragmentStatePagerAdapter {
     Activity activity;
     Fragment f = null;
public SectionsPagerAdapter(FragmentManager fm, Activity activity) {
    super(fm);
    this.activity = activity;
}

@Override
public Fragment getItem(int i) {        
    switch (i) {
    case 0: {           
        activity.runOnUiThread(new Runnable() {
            public void run() {
        try {
             f =  new FetchFragment().execute("one").get();             
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            }
        });             
        return f;
    }
    case 1: {
        activity.runOnUiThread(new Runnable() {
            public void run() {
        try {
             f =  new FetchFragment().execute("two").get();             
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            }
        });             
        return f;
    }
    }
    return null;
}

@Override
public int getCount() {
    return 2;
}

@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
    case 0:
        return "one";
    case 1:
        return "two";
    }
    return null;
}


class FetchFragment extends AsyncTask<String, Void, Fragment>
{   
@Override
protected Fragment doInBackground(String... arg0) {     
    if(arg0[0].equalsIgnoreCase("one"))
    {
        Fragment fragment = new OneFragment();
        Bundle args = new Bundle();
        args.putInt(CategoriesFragment.ARG_SECTION_NUMBER, 1);
        fragment.setArguments(args);
        return fragment;
    }
    if(arg0[0].equalsIgnoreCase("two"))
    {
        Fragment fragment = new TwoFragment();
        Bundle args = new Bundle();
        args.putInt(FeaturedFragment.ARG_SECTION_NUMBER, 2);
        fragment.setArguments(args);
        return fragment;
    }       
    return null;
}

@Override
 protected void onPostExecute(Fragment fragment){}
}
}

これが私のエラーログです。

10-23 12:52:28.835: E/AndroidRuntime(17485): FATAL EXCEPTION: AsyncTask #3
10-23 12:52:28.835: E/AndroidRuntime(17485): java.lang.RuntimeException: An error occured while executing doInBackground()
10-23 12:52:28.835: E/AndroidRuntime(17485):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.lang.Thread.run(Thread.java:856)
10-23 12:52:28.835: E/AndroidRuntime(17485): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-23 12:52:28.835: E/AndroidRuntime(17485):    at android.os.Handler.<init>(Handler.java:121)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at android.support.v4.app.ListFragment.<init>(ListFragment.java:47)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at com.store.fragments.OneFragment.<init>(OneFragment.java:68)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at com.store.adapter.SectionsPagerAdapter$FetchFragment.doInBackground(SectionsPagerAdapter.java:173)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at com.store.adapter.SectionsPagerAdapter$FetchFragment.doInBackground(SectionsPagerAdapter.java:1)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-23 12:52:28.835: E/AndroidRuntime(17485):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
4

2 に答える 2

2

わかりました、あなたは非同期タスクでそれを間違っています。通常、非同期タスクは、バックグラウンドで処理する必要がある時間のかかる操作に使用されますが、UiThreadで実行しようとしています。また、非同期タスクでは、doInBackground()でUIを変更しようとしていますが、onPostExecute()で変更することを強くお勧めします。

于 2012-10-23T07:48:01.123 に答える
1

AsyncTaskの.ALlでUIの更新を行わないでくださいdoInBackground()。UI操作はである必要がありますonPostExecute()。詳細についてはこちらをご覧ください

私の以前の投稿も参照してください

于 2012-10-23T07:45:51.310 に答える