我正在尝试将Fragment转换为Activity并遇到一些麻烦。 我有3个使用Intents运行的活动:
MainActivity -> DetailsActivity -> MyPagerActivity
PagerActivity执行一些UI工作,并在最后调用AsyncTask将一些数据发送到我的服务器。我的ASyncTask位于一个单独的Java文件中,我用“MyPagerActivity.this”作为上下文调用该函数:
NetFuncs nu = new NetFuncs();
...
nu.FinishWork(MyPagerActivity.this, workData1, WorkData2);
在NetFuncs中:
private Context mContext;
....
public void FinishWork(Context context, String Data1, long Data2) {
if (networkUtils.isNetworkAvailable(context)) {
new FinishWorkServerCall(context, Data1, Data2).execute();
}
private class FinishWorkServerCall extends AsyncTask<Void, Void, Void> {
public class FinishWorkServerCall (Context context, String Data1, long Data2) {
mContext = context;
...
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(mcontext);
pDialog.setMessage("Finishing your work...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
....
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if ( pDialog != null && pDialog.isShowing()) {
pDialog.dismiss();
pDialog = null;
}
}
在片段世界中,一切都很美妙。我一转到独立活动,就在pDialog.show();应用程序崩溃并出现以下错误:
Activity com.example.MyPagerActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{7acbcb8 V.E...... R......D 0,0-1026,348} that was originally added here
我google了很多,每个人都在谈论在postExecute()和onDestroy()中解雇,我正在做这两件事,但它没有帮助。 我认为问题是一个上下文问题,但我不知道问题是什么以及如何解决它。我使用了getApplicationContext(),getBaseContext(),没有用过。 我使用Toast()代替相同的问题,所以我猜它是一个contetx问题。
编辑: 当pDialog正在进行时,我的MyPagerActivity不会关闭或完成。它保持不变。
有人可以帮我弄清问题是什么,并帮助找到解决方案吗?
谢谢
答案 0 :(得分:0)
将其包装在try / catch块中:
try {
pDialog.show();
} cath (Exception ignored) {
// do nothing, activity keeps working
}
P.S。这是一个“黑客”,但问题仍然存在。当你的Activity在AsyncTask工作期间重新创建时,Ussualy会发生“泄漏窗口”。如果它在onDestroy()方法中显示,你可以尝试解除porgress。
答案 1 :(得分:0)
private class FinishWorkServerCall extends AsyncTask<Void, Void, Void> {
public class FinishWorkServerCall (Context context, String Data1, long Data2) {
mContext = context;
pDialog = new ProgressDialog(mcontext);
pDialog.setMessage("Finishing your work...");
pDialog.setCancelable(false);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
if (pDialog != null) {
pDialog.show();
}
}
答案 2 :(得分:-2)
我想我刚刚找到了解决方案: 我添加了一个处理程序:
h = new Handler(Looper.getMainLooper());
h.post(new Runnable() {
public void run() {
pDialog = new ProgressDialog(mcontext);
pDialog.setMessage("Finishing your work...");
pDialog.setCancelable(false);
pDialog.show();
}
});
并在处理程序中执行了pDialog。它解决了崩溃的问题......不确定为什么,但确实如此。有人可以帮我理解为什么会这样吗?