活动泄漏窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

7
我正在开发一款反馈类应用程序,当我点击“立即提交”按钮时,出现以下错误:
活动泄漏了窗口
com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

以下是我的代码,请帮我解决一下。
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;

    }
}

@raj,你能告诉我需要做哪些更改吗? - Raghu Kaligipula
еңЁAndroidжё…еҚ•ж–Ү件зҡ„activityж Үзӯҫдёӯж·»еҠ configChangesпјҢиҜ·еҸӮиҖғиҝҷдёӘй“ҫжҺҘпјҡhttp://stackoverflow.com/questions/20701149/configchanges-work-in-android-4-and-2-2/20701191#20701191 - SathishKumar
你检查了答案吗? - Sanket Kachhela
@SanketKachhela 是的,但我的应用程序仍然崩溃了。 - Raghu Kaligipula
我突然遇到了同样的问题,我卸载并重新安装了应用程序,它就开始正常工作了。 - Ranjithkumar
5个回答

11

内存泄漏是因为在活动被销毁后仍然保留了对它的引用,因此请使用

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

或者

使用这个,它会有所帮助。

@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();

4

为什么会出现这个错误...?

当您保留未使用的活动的引用时,就会出现此错误。

解决方案

在使用完进度条、对话框等后,请删除其引用。可以通过关闭它们或将它们设置为null来实现。

当不再需要它们时,您可以这样处理。

建议在onStop中处理。

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

3
在使用完dialog后,及时关闭它,这可以防止应用程序崩溃。
dialog.dismiss();

2

使用以下代码 progressDialog.dismiss();


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接