java - Activity 已泄漏窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0

标签 java android android-dialog android-dialogfragment

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

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;

    }
}

最佳答案

泄漏的发生是因为你在它被销毁后还保留了 Activity 的引用,所以使用

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

关于java - Activity 已泄漏窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755918/

相关文章:

android - 使用 Html.fromHtml 设置自定义字体

具有透明布局的 Android Activity

java - 创建一个 Spring 枚举 bean 并传递方法调用的值

java - 宽松绑定(bind)不适用于具有自定义系统环境属性源的组合 @ConfigurationProperties 名称

java - 速率限制预防 [Twitter4J]

java - 主题未保存在共享首选项中

java - 我不明白为什么这个简单的语句不起作用

java - 有谁知道我在哪里可以找到 android 的 ICS home 按钮的代码?

安卓 'Unable to add window -- token null is not for an application'异常

java - Dialog 内的 RecyclerView 底部被截断