某些具体情况:
我有两个Activities
。 FirstActivity
从网络加载数据(~100 kb),并且能够通过SecondActivity
启动startActivityForResult()
。获得结果后,应触发另一个网络呼叫。除了性能之外,一切正常。这是问题所在。
我从AsyncTask
或onActivityResult()
或onResume()
触发onPostResume()
。我希望SecondActivity
完成,显示FirstActivity
并显示ProgressBar
,表明我的下载工作正常。但相反,我看到以下内容:
SecondActivity
冻结,FirstActivity
启动(我在日志中看到),AsyncTask
触发,FirstActivity
仅在AsyncTask
完成工作时显示!
这也很奇怪,因为我在首次启动FirstActivity
时使用完全相同的代码,并且所有代码都按预期工作。
所以,问题是:
从AsyncTask
和onCreate()
发起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)。为什么会引起麻烦?
答案 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()
。尽可能快地执行此操作非常重要。当我改进这种方法时,问题就消失了。