Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.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
Java Activity com.example.mediastore.LoginActivity泄露了window com.android.internal.policy.impl.PhoneWindow$DecorView_Java_Android_Android Layout_Memory Leaks - Fatal编程技术网

Java Activity com.example.mediastore.LoginActivity泄露了window com.android.internal.policy.impl.PhoneWindow$DecorView

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,

我有一个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,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);
    }