Android 2.1中的TabHost和AsyncTasks
我的应用程序启动时有一个TabActivity,它有四个选项卡,每个选项卡都有一个关联的ListView活动作为其内容。理想情况下,我希望在onCreate中启动一个异步任务来初始化Drupal XMLRPC连接,完成后,我创建tabHost并在onPostExecute中添加选项卡。这在Android 2.2及更高版本中运行良好,但在2.2及更低版本中会立即导致强制关闭。据我所知,在Android 2.2更低版本中,TabActivity要求在完成任何其他操作(包括异步任务)之前创建选项卡?如果有人对如何在setCurrentTab中启动活动之前实现运行AsyncTask的TabActivity有任何建议,我将不胜感激。这是我正在使用的onCreate,用于初始化tabHost以供参考:Android 2.1中的TabHost和AsyncTasks,android,android-asynctask,android-tabhost,tabactivity,Android,Android Asynctask,Android Tabhost,Tabactivity,我的应用程序启动时有一个TabActivity,它有四个选项卡,每个选项卡都有一个关联的ListView活动作为其内容。理想情况下,我希望在onCreate中启动一个异步任务来初始化Drupal XMLRPC连接,完成后,我创建tabHost并在onPostExecute中添加选项卡。这在Android 2.2及更高版本中运行良好,但在2.2及更低版本中会立即导致强制关闭。据我所知,在Android 2.2更低版本中,TabActivity要求在完成任何其他操作(包括异步任务)之前创建选项卡?如
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
tabHost = getTabHost(); //The activity TabHost
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar);
TabHost.TabSpec spec; //Reusable TabSpec for each tab
Intent intent; //Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, BlogList.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("Blog Posts").setIndicator("Blog Posts")
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, DiariesList.class);
spec = tabHost.newTabSpec("Diaries").setIndicator("Diaries")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, BoardList.class);
spec = tabHost.newTabSpec("MGoBoard").setIndicator("MGoBoard")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, UserActivityList.class);
spec = tabHost.newTabSpec("My Account").setIndicator("My Account")
.setContent(intent);
tabHost.addTab(spec);
tabHost.getTabWidget().getChildAt(0).getLayoutParams().height = 50;
tabHost.getTabWidget().getChildAt(1).getLayoutParams().height = 50;
tabHost.getTabWidget().getChildAt(2).getLayoutParams().height = 50;
tabHost.getTabWidget().getChildAt(3).getLayoutParams().height = 50;
tabHost.setCurrentTab(0);
}
使用TabHost时,2.1和2.2之间存在差异。对不起,我现在不能给出一个完整的答案,因为我没有时间。如果您没有得到答案,请在开始时用@MisterSquonk发表评论,我将查看我是如何解决此问题的。@MisterSquonk我还没有答案,希望知道您是如何解决的。我回顾了我遇到问题的代码。不确定这是否会有帮助,但最终我分两部分解决了它。首先,我创建了一个扩展应用程序的类,并将一些初始化代码放在其中。其次,我的AsyncTask是一个文件下载程序,我创建了一个单独的活动,带有“启动屏幕”的外观,并将其作为清单中的主要活动。当它完成它正在做的事情时,它会启动我的TabActivity并自动调用finish。@MisterSquonk闪屏解决方案就是我最后要做的。我唯一的问题是,如果用户在另一个活动中离开应用程序,然后从该活动中恢复应用程序。未到达初始屏幕,因此我需要的初始异步任务未运行。我正在讨论在onPause中调用finish,这样用户就会被迫返回初始屏幕。我唯一能想到的是修改用于选项卡内容的类,使它们不依赖于连接,而是创建自己的默认“未连接”视图。然后,他们可以启动AsyncTask建立连接,然后更新内容。