FragmentTabHost和异步任务

时间:2014-08-06 10:17:18

标签: android asynchronous android-fragments android-asynctask android-tabhost

问题:

我正在尝试使用Fragments创建包含FragmentTabHost的两个标签。

以下是我将标签添加到FragmentTabHost(包含标签的onCreate的{​​{1}}方法的位置:

FragmentActivity

然而,问题是@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_financials); mTabHost = (FragmentTabHost) findViewById(R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); mTabHost.addTab( mTabHost.newTabSpec(TAG_ONE).setIndicator("Tab #1", getResources().getDrawable(android.R.drawable.star_on)), MyFragmentOne.class, null); mTabHost.addTab( mTabHost.newTabSpec(TAG_TWO).setIndicator("Tab #2", getResources().getDrawable(android.R.drawable.star_on)), MyFragmentTwo.class, null); if(savedInstanceState == null) { new MyAsyncTask(MyClass.this).execute(); } else { mTabHost.setCurrentTabByTag(savedInstanceState.getString("TAB_TAG")); } } MyFragmentOne都在等待来自MyFragmentTwo的数据。也就是说,每个片段中的视图只能在MyAsyncTask完成运行后正确创建。

所以当我添加标签时,我最终得到MyAsyncTask,因为NullPointerException尚未提取所需的数据。

我的解决方案尝试:

我尝试在AsyncTask TabHost#addTab()中调用onPostExecute(),以便仅在 MyAsyncTask完成后创建片段,从而避免任何null指针。

但是,通过将MyAsyncTask来电转移到addTab()的{​​{1}},我收到错误:onPostExecute()。 Logcat下面。

logcat的:

AsyncTask

那么我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

我最终使用空白PlaceHolderFragment并在onPostExecute()中以编程方式删除它们,如下所示:

mTabHost.addTab(
            mTabHost.newTabSpec("Placeholder one").setIndicator("Tab #1",
                    getResources().getDrawable(android.R.drawable.star_on)),
                    PlaceHolderFragment.class, null);
mTabHost.addTab(
            mTabHost.newTabSpec("Placeholder two").setIndicator("Tab #2",
                    getResources().getDrawable(android.R.drawable.star_on)),
                    PlaceHolderFragment.class, null);

然后在onPostExecute()

mTabHost.setCurrentTab(0);
mTabHost.clearAllTabs();

mTabHost.addTab(
        mTabHost.newTabSpec(TAG_ONE).setIndicator("Tab #1",
                getResources().getDrawable(android.R.drawable.star_on)),
                MyFragmentOne.class, null);
mTabHost.addTab(
        mTabHost.newTabSpec(TAG_TWO).setIndicator("Tab #2",
                getResources().getDrawable(android.R.drawable.star_on)),
                MyFragmentTwo.class, null);

答案 1 :(得分:0)

您可以使用回调创建AsyncTaks。然后在该回调中,您可以使用数据创建选项卡。

例如: android asynctask sending callbacks to ui

这只是一个例子,有很多使用asyncTask和callbacks的例子