0

这个问题与AsyncTask需要杀死 a 的 a 有关ProgressDialog。在任务运行时,活动被销毁并重新创建(例如手机轮换)。在 的帮助下创建了一个新对话框,onSaveInstanceState()AsyncTask由先前销毁的活动产生的 ,看不到它。

图片,如果你愿意的话……(例如,为了快速样机代码)。

public class Bob extends Activity {

    private ProgressDialog m_d;

    public void onCreate(Bundle b) {
        m_d = new ProgressDialog(this);
        // ...
        if (b != null) {
            if (b.getBoolean("dialog") == true)
                m_d.show();
        }
        // ...
    }

    public void onSaveInstanceState(Bundle b) {
        super.onSaveInstanceState(b);
        b.putBoolean("dialog", (m_d.isShowing()));
    }

    public void onDestroy() {
        if (m_d.isShowing()) {
            m_d.dismiss();
            m_d = null;
        }
        //...
    }
}

AsyncTask onPreExecute()m_d.show()onPostExecute()m_d.hide()。_

问题是当我的活动被重新创建时(例如,在手机轮换时),AsyncTask似乎有旧的m_d. 是的null,因为那被杀了onDestroy()

它没有 new m_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) {
        // ...
    }
}

如果 Android 在任务运行时没有终止我的活动,那很好。像我预期的ProgressDialog那样弹出并消失。

如果 Android 在任务运行时出于任何原因决定重新启动我的活动,即使我在其中重新创建了它,它m_d也会null在其中- 它有旧的,而不是新的。onPostExecute()onCreate()m_d

4

1 回答 1

1

有两个问题:第一个AsyncTask是绑定到创建它的活动。我的意思是,活动的实例。

如果您希望它在活动轮换之间存活,您必须将其存储在其他地方(例如检查此)。在任何情况下,您都需要从新活动中引用它(您可以做的另一件事是使用模型片段,即没有您设置为 UI 的片段setRetainInstance(true))。

一旦您从新创建的活动中获得了对异步任务的引用,就没有什么可以阻止您拥有m_d异步任务的本地以及使用新对话框更新它的 setter 方法。

另请注意,最好让弱引用指向活动和对话框本身,以便允许垃圾收集。否则,在任务本身的执行结束之前,不会释放对话框(可能还有活动本身)。

于 2013-03-13T22:34:34.100 回答