Android ProgressDialog,activity';s onCreate()和AsyncTask
这个问题与需要终止Android ProgressDialog,activity';s onCreate()和AsyncTask,android,android-asynctask,progressdialog,android-lifecycle,Android,Android Asynctask,Progressdialog,Android Lifecycle,这个问题与需要终止ProgressDialog的AsyncTask有关。当任务运行时,活动将被销毁并重新创建(例如,电话轮换)。在onSaveInstanceState()的帮助下创建了一个新对话框,但是由先前销毁的活动生成的AsyncTask无法看到它 照片,如果你愿意。。。(例如,快速原型代码) AsyncTaskonPreExecute()执行m\u d.show()和onPostExecute()执行m\u d.hide() 问题是,当我的活动被重新创建时(例如,在电话轮换中),Asyn
ProgressDialog
的AsyncTask
有关。当任务运行时,活动将被销毁并重新创建(例如,电话轮换)。在onSaveInstanceState()
的帮助下创建了一个新对话框,但是由先前销毁的活动生成的AsyncTask
无法看到它
照片,如果你愿意。。。(例如,快速原型代码)
AsyncTask
onPreExecute()
执行m\u d.show()
和onPostExecute()
执行m\u d.hide()
问题是,当我的活动被重新创建时(例如,在电话轮换中),AsyncTask
似乎具有旧的mud
。它是null
,因为它在onDestroy()中被杀死
它没有在重新创建活动时创建的新的mu d
。现在我有了一个ProgressDialog
,而在onPostExecute()
中应该杀死它的人看不到它
现在怎么办?我需要旧的AsyncTask
以某种方式发出信号,让新的ProgressDialog
消失
private OnItemSelectedListener onSpinnerSelection = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// ...
new Switcharoo().execute();
}
}
private class Switcharoo extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
m_d.show();
// ...
}
protected void onPostExecute() {
if (m_d != null) m_d.hide();
// ...
}
protected Void doInBackground(Void... arg0) {
// ...
}
}
private OnItemSelectedListener onSpinnerSelection=new OnItemSelectedListener(){
已选择公共视图(AdapterView arg0、视图arg1、内部arg2、长arg3){
// ...
新的Switcharoo().execute();
}
}
私有类Switcharoo扩展异步任务{
受保护的void onPreExecute(){
m_d.show();
// ...
}
受保护的void onPostExecute(){
如果(m_d!=null)m_d.hide();
// ...
}
受保护的Void doInBackground(Void…arg0){
// ...
}
}
如果Android在任务运行时不停止我的活动,那也没关系。ProgressDialog
弹出并像我预期的那样消失
如果Android在任务运行时出于任何原因决定重新启动我的活动,onPostExecute()
中的mud
将为null
,即使我在onCreate()
中重新创建了它-它具有旧的mud
,不是新任务。有两个问题:第一个问题是AsyncTask
绑定到创建它的活动。我的意思是,活动的实例
如果你想让它在活动轮换之间存活下来,你必须将它存储在其他地方(例如检查)。在任何情况下,您都需要从新活动中获得对它的引用(您可以做的另一件事是使用一个模型片段,即没有UI的片段,您将其设置为setRetainInstance(true)
)
一旦您从新创建的活动中获得了对异步任务的引用,就没有什么可以阻止您将m_d
本地设置到异步任务以及使用新对话框更新它的setter方法
还要注意,为了允许垃圾收集,最好使用指向活动和对话框本身的弱引用。否则,直到任务本身的执行结束,对话框(可能还有活动本身)才会被释放。在此处添加您正在执行asynctask的行。添加,尽管我不确定它是否有帮助。非常通用。当旧的活动被破坏时,你能钩住一些代码来更新m_d吗?我不知道,可以吗?如何将新m_d传递到已经运行的异步任务中?或者AsyncTask如何通知新活动它已经完成了?真是太好了。对于那些在家玩的人来说,秘诀是使用“OnRetainonConfiguration实例”返回最初创建的AsyncTask。当Android销毁并重新制作活动时,新实例使用getLastNonConfigurationInstance获取指向原始AsyncTask的指针。然后它可以调用soemthing,比如m_switcharoo.setDialog(m_d),然后在switcharoo内部,它将自己的m_d指定为传入值,这是新的对话框。还要注意,片段显然取代了所有这些,这些调用在API 13中被弃用,但我是根据API 8编码的。
private OnItemSelectedListener onSpinnerSelection = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// ...
new Switcharoo().execute();
}
}
private class Switcharoo extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
m_d.show();
// ...
}
protected void onPostExecute() {
if (m_d != null) m_d.hide();
// ...
}
protected Void doInBackground(Void... arg0) {
// ...
}
}