Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ProgressDialog,activity';s onCreate()和AsyncTask_Android_Android Asynctask_Progressdialog_Android Lifecycle - Fatal编程技术网

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) {
        // ...
    }
}