Java Activity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20755918/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 04:06:42  来源:igfitidea点击:

Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

javaandroidandroid-dialogandroid-dialogfragment

提问by Raghu Kaligipula

I am developing an feedback kind of application, when I click the "submitnow" button I am getting the following error

我正在开发一种反馈类型的应用程序,当我单击“立即提交”按钮时,出现以下错误

Activity has leaked window

活动已泄露窗口

com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

Following is my code, please help me out.

以下是我的代码,请帮助我。

public class SignOut_Activity extends SherlockActivity implements
        OnClickListener {

    Button btnSubmitNow, btnSubmitLater;
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.signout);

        ((TextView) findViewById(R.id.tvSubTitle))
                .setText(StoresListAdapter.StoreName);

        btnSubmitNow = (Button) findViewById(R.id.btnSubmitNow);
        btnSubmitLater = (Button) findViewById(R.id.btnSubmitLater);

        btnSubmitNow.setOnClickListener(this);
        btnSubmitLater.setOnClickListener(this);

        progressDialog = new ProgressDialog(SignOut_Activity.this);
        progressDialog.setMessage("Uploading data, please wait...");

    }

    @Override
    public boolean onOptionsItemSelected(
            com.actionbarsherlock.view.MenuItem item) {

        switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; finish activity to go home
            finish();
            break;

        default:
            break;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onResume() {
        super.onResume();
        // Set title
        getSupportActionBar().setTitle("Sign Out");

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.btnSubmitNow:
            // Submit now

            // Sample upload image
            UploadImage.uploadImage("testimage");

            new AsyncTask<Void, Void, Void>() {

                // called before execution // main/UI thread
                protected void onPreExecute() {
                    progressDialog.show();
                };

                @Override
                protected Void doInBackground(Void... params) {
                    // Submit the store data
                    StoreData.postData(StoreList_Activity.storesList
                            .get(StoresListAdapter.Position));
                    return null;
                }

                // on store data uploaded // main/UI thread
                protected void onPostExecute(Void result) {
                    progressDialog.dismiss();
                    setSignOut();
                    StoreList_Activity.storesList
                            .get(StoresListAdapter.Position).isSubmitted = true;
                    SignOut_Activity.this.finish();
                };

            }.execute();

            break;
        case R.id.btnSubmitLater:
            // Submit later
            setSignOut();
            StoreList_Activity.storesList.get(StoresListAdapter.Position).isSubmitLater = true;
            VisitOps_Activity.isSubmitLater = true;
            SignOut_Activity.this.finish();

            break;

        default:
            break;
        }

    }

    @SuppressLint("SimpleDateFormat")
    private void setSignOut() {

        VisitOp visitOp10 = new VisitOp();
        visitOp10.setName("Sign Out");
        visitOp10.setStatus("");
        SampleData.visitOpsList.add(visitOp10);

        if (VisitOps_Activity.VisitOps.SignOut == null)
            VisitOps_Activity.VisitOps.SignOut = new SignOut();

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String currentDateandTime = sdf.format(new Date());

        VisitOps_Activity.VisitOps.SignOut.SignOutTime = "Out: "
                + currentDateandTime;

    }
}

采纳答案by Sanket Kachhela

Leak comes because you are keeping reference of activity after it destroyed also so use

泄漏是因为您在活动销毁后仍保留对活动的引用,因此请使用

if(progressDialog !=null)
{
    progressDialog = null;
}
progressDialog = new ProgressDialog(this.getApplicationContext());
        progressDialog.setMessage("Uploading data, please wait...");

OR

或者

use this it will help

使用它会有所帮助

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.btnSubmitNow:
        // Submit now

        // Sample upload image
        UploadImage.uploadImage("testimage");

        new AsyncTask<Void, Void, Void>() {

            // called before execution // main/UI thread
            protected void onPreExecute() {


             progressDialog = new ProgressDialog(SignOut_Activity.this);
             progressDialog.setMessage("Uploading data, please wait...");  

            progressDialog.show();
            };

            @Override
            protected Void doInBackground(Void... params) {
                // Submit the store data
                StoreData.postData(StoreList_Activity.storesList
                        .get(StoresListAdapter.Position));
                return null;
            }

            // on store data uploaded // main/UI thread
            protected void onPostExecute(Void result) {
                progressDialog.dismiss();
                setSignOut();
                StoreList_Activity.storesList
                        .get(StoresListAdapter.Position).isSubmitted = true;
                SignOut_Activity.this.finish();
            };

        }.execute();

回答by The Ray of Hope

use that code progressDialog.dismiss();

使用那个代码 progressDialog.dismiss();

回答by The Ray of Hope

Dismiss the dialogafter its use, it won't let your application crash.

dialog使用后关闭它,它不会让您的应用程序崩溃。

dialog.dismiss();

回答by Harsh Dattani

Make sure you dismiss() the dialog, after dialog use and before any next background process to be initiated.

确保在使用对话框之后和启动任何下一个后台进程之前关闭()对话框。

回答by Mina Fawzy

Why this Error...?

为什么这个错误...?

this error happen when you keep reference of unused activity

当您保留未使用活动的参考时会发生此错误

Solution

解决方案

remove reference of progress bar , dialog .....etc after use it .

使用后删除进度条、对话框.....等的引用。

by dismiss them or make them equal null

通过解雇他们或使他们等于 null

you can approach this when no longer need of it

当不再需要它时,您可以使用它

Recommendedput it in onStop

建议把它放在onStop

 @Override
    protected void onStop() {
  super.onStop();
        if(_dialog.isShowing()){
            _dialog.dismiss();
        }
        if(_dialog != null){
            _dialog = null;
        }
}