Java Activity com.example.mediastore.LoginActivity泄露了window com.android.internal.policy.impl.PhoneWindow$DecorView
我有一个loginActivity,它会将我重定向到userViewActivity,但我遇到以下错误:Java Activity com.example.mediastore.LoginActivity泄露了window com.android.internal.policy.impl.PhoneWindow$DecorView,java,android,android-layout,memory-leaks,Java,Android,Android Layout,Memory Leaks,我有一个loginActivity,它会将我重定向到userViewActivity,但我遇到以下错误: 10-03 00:50:11.628: E/WindowManager(1820): Activity com.example.mediastore.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b558aee8 V.E..... R.....ID 0,0-456,
10-03 00:50:11.628: E/WindowManager(1820): Activity com.example.mediastore.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b558aee8 V.E..... R.....ID 0,0-456,144} that was originally added here
10-03 00:50:11.628: E/WindowManager(1820): android.view.WindowLeaked: Activity com.example.mediastore.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b558aee8 V.E..... R.....ID 0,0-456,144} that was originally added here
10-03 00:50:11.628: E/WindowManager(1820): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
10-03 00:50:11.628: E/WindowManager(1820): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
10-03 00:50:11.628: E/WindowManager(1820): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-03 00:50:11.628: E/WindowManager(1820): at android.app.Dialog.show(Dialog.java:281)
10-03 00:50:11.628: E/WindowManager(1820): at com.example.mediastore.LoginActivity$userLogin.onPreExecute(LoginActivity.java:80)
10-03 00:50:11.628: E/WindowManager(1820): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
10-03 00:50:11.628: E/WindowManager(1820): at android.os.AsyncTask.execute(AsyncTask.java:534)
10-03 00:50:11.628: E/WindowManager(1820): at com.example.mediastore.LoginActivity$1.onClick(LoginActivity.java:63)
10-03 00:50:11.628: E/WindowManager(1820): at android.view.View.performClick(View.java:4202)
10-03 00:50:11.628: E/WindowManager(1820): at android.view.View$PerformClick.run(View.java:17340)
10-03 00:50:11.628: E/WindowManager(1820): at android.os.Handler.handleCallback(Handler.java:725)
10-03 00:50:11.628: E/WindowManager(1820): at android.os.Handler.dispatchMessage(Handler.java:92)
10-03 00:50:11.628: E/WindowManager(1820): at android.os.Looper.loop(Looper.java:137)
10-03 00:50:11.628: E/WindowManager(1820): at android.app.ActivityThread.main(ActivityThread.java:5039)
10-03 00:50:11.628: E/WindowManager(1820): at java.lang.reflect.Method.invokeNative(Native Method)
10-03 00:50:11.628: E/WindowManager(1820): at java.lang.reflect.Method.invoke(Method.java:511)
10-03 00:50:11.628: E/WindowManager(1820): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-03 00:50:11.628: E/WindowManager(1820): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-03 00:50:11.628: E/WindowManager(1820): at dalvik.system.NativeStart.main(Native Method)
视图应该在Activity类而不是子类中声明,在设置侦听器之前,将以下代码行从onPreExecute()方法移到onCreate()中:
pDialog = new ProgressDialog(LoginActivity.this);
pDialog.setMessage("Logging user..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
然后显示对话框,您可以在上面使用newuserlogin().execute()调用AsyncTask
代码>
看起来@CodeMagic找到了:试着像这样在后台更改do方法。请记住,布尔标志位于doInBackground方法上方:
boolean startNewActivity = false;
protected String doInBackground(String... args) {
String username = inputusername.getText().toString();
String password = inputpassword.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_users,
"POST", params);
// check log cat fro response
Log.d("Login Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
startNewActivity=true;
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
我认为问题在于您正在doInBackground()
中调用finish()
,并且没有正确关闭ProgressDialog
。尝试覆盖您的finish()
,如果它处于打开状态,请将其关闭
@Override
public void finish()
{
if (pDialog != null && pDialog.isShowing())
{
pDialog.dismiss();
}
}
我认为问题在于您在完成进度对话框之前开始了活动。在关闭“进度”对话框后,只需启动“活动”。首先定义布尔变量,如startActivity
if (success == 1) {
// successfully created product
startActivity=true;
// closing this screen
finish();
} else {
// failed to create product
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
if(startActivity)
Intent i = new Intent(getApplicationContext(), UserViewActivity.class);
startActivity(i);
}
在AsyncTask
中声明/初始化ProgressDialog
是完全可以的,即使在doInBackground()中也可以?只是好奇!不在doInBackground()
中,因为这是唯一不在UI线程上运行的AsyncTask
方法。这是我错过的地方吗?不,我只是好奇。好吧,我不确定我是否错过了什么。我在做了你的解决方案后遇到了这些问题:10-03 01:30:20.138:W/dalvikvm(1831):threadid=20:thread退出时出现未捕获异常(group=0xb4c90908)。如果你发生崩溃,那么日志中还有更多内容。请编辑您的问题并将其张贴在那里。确保将此方法放在活动中
。这是另一个问题。看起来UserViewActivity
未在manifest.xml
中正确声明。另外,您应该使用LoginActivity。这个而不是getApplicationContext()
oh ya我忘了在mainfest中声明它:(,问题现在解决了。
boolean startNewActivity = false;
protected String doInBackground(String... args) {
String username = inputusername.getText().toString();
String password = inputpassword.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_users,
"POST", params);
// check log cat fro response
Log.d("Login Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
startNewActivity=true;
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
if(startNewActivity) {
Intent i = new Intent(getApplicationContext(), UserViewActivity.class);
startActivity(i);
}
}
}
@Override
public void finish()
{
if (pDialog != null && pDialog.isShowing())
{
pDialog.dismiss();
}
}
if (success == 1) {
// successfully created product
startActivity=true;
// closing this screen
finish();
} else {
// failed to create product
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
if(startActivity)
Intent i = new Intent(getApplicationContext(), UserViewActivity.class);
startActivity(i);
}