【问题标题】:Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0Activity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0
【发布时间】:2013-12-24 06:21:23
【问题描述】:

我正在开发一种反馈类型的应用程序,当我单击“submitnow”按钮时,我收到以下错误

Activity已经泄露窗口

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 你能告诉我要做什么改变吗
  • 在你的 android manifest 文件的活动标签中添加 configChanges,参考这个,stackoverflow.com/questions/20701149/…
  • 你检查答案了吗?
  • @SanketKachhela 是的,但我的应用程序仍然崩溃..
  • 我突然遇到同样的问题,我卸载并重新安装了它开始正常工作的应用程序。

标签: java android android-dialog android-dialogfragment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    解决方案

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

    通过关闭它们或使它们等于 null

    你可以在不再需要它时处理它

    推荐放在onStop

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

    【讨论】:

      【解决方案3】:

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

      dialog.dismiss();
      

      【讨论】:

        【解决方案4】:

        使用该代码progressDialog.dismiss();

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-22
            • 1970-01-01
            • 2012-08-13
            • 1970-01-01
            • 2012-08-11
            • 2011-07-08
            • 2012-04-07
            相关资源
            最近更新 更多