web-dev-qa-db-ja.com

アクティビティがウィンドウcom.Android.internal.policy.impl.PhoneWindow$DecorView@46029dd0をリークしました

フィードバックのようなアプリケーションを開発しています。「送信」ボタンをクリックすると、次のエラーが発生します。

アクティビティがウィンドウをリークしました

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;

    }
}
7

リークは、破壊された後もアクティビティの参照を保持しているために発生するため、使用してください

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();
11
Sanket Kachhela

なぜこのエラー...?

このエラーは、未使用のアクティビティの参照を保持している場合に発生します

解決

使用後にプログレスバー、ダイアログ.....などの参照を削除します。

それらを却下するか、nullに等しくすることによって

あなたはそれをもはや必要としないときにこれに近づくことができます

推奨 onStopに入れます

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

使用後にdialogを閉じると、アプリケーションがクラッシュすることはありません。

dialog.dismiss();
3
user3855135

そのコードを使用するprogressDialog.dismiss();

2
The Ray of Hope

ダイアログを使用した後、次のバックグラウンドプロセスを開始する前に、必ずダイアログをdismiss()してください。

1
Harsh Dattani