Android 使用ProgressDialog和AsyncTask避免样板文件?
我有一个包含很多活动的应用程序,其中很多都使用各种json web API来加载和显示数据。常见模式类似于:Android 使用ProgressDialog和AsyncTask避免样板文件?,android,android-activity,android-asynctask,progressdialog,Android,Android Activity,Android Asynctask,Progressdialog,我有一个包含很多活动的应用程序,其中很多都使用各种json web API来加载和显示数据。常见模式类似于: public class MyActivity extends Activity { public void OnCreate(Bundle savedInstanceState) { ... ProgressDialog pd = ProgressDialog.show( ... ); // This is a custom A
public class MyActivity extends Activity {
public void OnCreate(Bundle savedInstanceState) {
...
ProgressDialog pd = ProgressDialog.show( ... );
// This is a custom API which wraps AsynkTask and calls my callback in onPostExecute
DoWebThing(url, new Callback() {
public void onSuccess(String json) {
pd.dismiss();
// Do other UI stuff with the json data
}
});
}
}
这非常有效,与您在SO和教程中找到的许多代码片段类似。问题是,用户可以在后台进程运行时离开页面。在本例中,我得到一个关于泄漏视图(ProgressDialog)的logcat错误,然后当我关闭它或执行其他UI操作时,我将崩溃
我已尝试在成功时添加提前签入:
if (!pd.isShowing()) {
return;
}
这修复了某些设备上的崩溃,但其他设备上没有,并且我们仍然得到关于泄漏视图的logcat错误
我已尝试用MyActivity.this.isFinishing()
替换pd.isShowing()
检查,这对任何事情都没有帮助(在我当前测试的设备上)。仍然得到logcat错误和崩溃
我已经尝试了MyActivity.this.isDestroyed()
,它修复了崩溃,但只在SDK 17+上工作,并且仍然得到logcat错误
要真正解决此问题,唯一的选择是将“我的进度”对话框设置为成员变量,并覆盖OnDestroy()
:
现在在我的回调中,我可以检查mProgressDialog==null
这很有效。没有关于泄漏视图的崩溃和logcat错误。但这感觉像是很多样板文件——我必须让进度对话框成为一个成员变量,并在我所有(许多)做后台工作的活动中覆盖ondestory()
我没有看到更好的选择,但在我开始更新大量活动之前,我需要第二个意见。创建一个活动,比如NetworkBaseActivity。在此活动中创建ProgressDialog并处理onDestroy。还创建一个名为
showMyDialog()
和hideMyDialog()
的方法来显示和隐藏对话框(从子类)。现在,所有做背景工作的活动只需扩展此活动。要显示对话框,请调用showMyDialog()
,要隐藏对话框,请调用hideMyDialog()
大概是这样的:
public class NetworkBaseActivity extends AppCompatActivity{
ProgressDialog myDialog;
onCreate(Bundle bundle){
// initialize myDialog
}
public void showDialog(){
// show myDialog if not shown
}
public void hideDialog(){
// hide myDialog if already shown
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
public class YourActivity extends NetworkBaseActivity{
}
我在stackoverflow中直接输入了代码,请原谅我的输入错误,但您明白了。FYI最好继续使用实时数据和体系结构组件谢谢,我希望避免更改我所有活动的基类,但我同意这似乎是最好的选择。
public class NetworkBaseActivity extends AppCompatActivity{
ProgressDialog myDialog;
onCreate(Bundle bundle){
// initialize myDialog
}
public void showDialog(){
// show myDialog if not shown
}
public void hideDialog(){
// hide myDialog if already shown
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
public class YourActivity extends NetworkBaseActivity{
}