onActivityResult之后在onResume中执行asynctask

时间:2012-01-09 09:06:21

标签: android android-asynctask

某些具体情况:

我有两个ActivitiesFirstActivity从网络加载数据(~100 kb),并且能够通过SecondActivity启动startActivityForResult()。获得结果后,应触发另一个网络呼叫。除了性能之外,一切正常。这是问题所在。

我从AsyncTaskonActivityResult()onResume()触发onPostResume()。我希望SecondActivity完成,显示FirstActivity并显示ProgressBar,表明我的下载工作正常。但相反,我看到以下内容:

SecondActivity冻结,FirstActivity启动(我在日志中看到),AsyncTask触发,FirstActivity仅在AsyncTask完成工作时显示!

这也很奇怪,因为我在首次启动FirstActivity时使用完全相同的代码,并且所有代码都按预期工作。

所以,问题是:

AsyncTaskonCreate()发起onActivityResult()之间有什么区别?为什么android的表现如此?它是特定版本的吗?

非常感谢。

一些代码:

活动A(第一):

void onCreate() {
    super.onCreate();
    setupUI();
    code = 1;
    launchLoading(code);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    launchLoading(resultCode);
}

活动B(第二名):

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            setResult(i);
            finish();
        }
 });

UPD

我在onPostExecute()方法中创建了一个自定义视图列表(~50)。为什么会引起麻烦?

3 个答案:

答案 0 :(得分:0)

当你从另一个活动返回时,它只是恢复活动,它不会进入onCreate方法()。您需要做的是使用 startActivityForResult()从asyntask活动中启动另一个活动,并在asyntask活动中覆盖 onActivityResult 方法。并在onActivityResult()中再次执行asyntask。你做得更好,而不是在Onresume中调用asyntask,因为在其他情况下它也会像Onresume一样进入Onresume,就像按下home键再去一次

答案 1 :(得分:0)

onPostExecute(..)onPreExecute(..)方法都在UI线程中执行(可能导致冻结),而doInBackground(..)在单独的线程中执行。考虑将耗时的操作从onPostExecute(..)转移到doInBackground(..)方法。

无论如何,如果没有看到AsyncTask类和launchLoading(resultCode)方法代码,很难建议你。

答案 2 :(得分:0)

感谢所有人。在其他地方发现了这个问题。在FirstActivity我有一个自定义视图列表。每个视图都包含一个小位图,但这些视图的计数接近50.因此,当您返回FirstActivity时,会为每个视图调用onMeasure()。尽可能快地执行此操作非常重要。当我改进这种方法时,问题就消失了。