2010-09-22 41 views
11

Ứng dụng của tôi thường xuyên ném ngoại lệ như dưới đây:Ứng dụng của tôi thường xuyên ném ngoại lệ android.view.WindowLeaked -

E/Chương trình quản lý cửa sổ X (6282): android.view.WindowLeaked: Hoạt động com.myActivity đã bị rò rỉ cửa sổ [email protected] rằng ban đầu được thêm vào ở đây

ứng dụng cho thấy một hộp thoại tiến bộ khi chính bắt đầu hoạt động và bắt đầu một nhiệm vụ. Khi công việc được thực hiện, nó sẽ bỏ qua hộp thoại tiến trình.

Mã của tôi giống như dưới đây. Ai đó có thể giúp tôi?

public class MyActivity extends Activity { 

private static int ID_DIALOG_PROGRESS = 2001; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.my_activity); 
    showDialog(ID_DIALOG_PROGRESS); 
    new MyTask().execute(null, null, null); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if (id == ID_DIALOG_PROGRESS) { 
     ProgressDialog loadingDialog = new ProgressDialog(this); 
     loadingDialog.setTitle(""); 
     loadingDialog.setMessage(""); 
     loadingDialog.setIndeterminate(true); 
     loadingDialog.setCancelable(false); 
     return loadingDialog; 
    } 

    return super.onCreateDialog(id); 
} 

private class MyTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... arg0) { 

      /* Do something expensive here...*/ 

      /* Start other activity*/ 
      Intent intent = new Intent(MyActivity.this, OtherActivity.class); 
      startActivityForResult(intent, 1000); 
     } 

     return null; 
    } 

    protected void onPostExecute(Void arg0) { 
     dismissDialog(ID_DIALOG_PROGRESS); 
    } 
} 
} 

Hầu hết thời gian, ngoại lệ được gửi từ cuộc gọi showDialog(). Lần khác, ngoại lệ được ném từ cuộc gọi dismissDialog().

Cảm ơn bạn trước!

Trả lời

6

Bạn đang bắt đầu một hoạt động mới trong doInBackground() trước khi bạn loại bỏ hộp thoại trong onPostExecute(), đó có thể là nguyên nhân khiến hộp thoại bị rò rỉ. Tôi sẽ di chuyển

Intent intent = new Intent(MyActivity.this, OtherActivity.class); 
startActivityForResult(intent, 1000); 

đến onPostExecute() sau khi gọi dismissDialog() và xem điều gì sẽ xảy ra.

0

Nó cũng thực hành tốt để đặt một thử ... bắt xung quanh

dismissDialog(ID_DIALOG_PROGRESS); 

Nếu không, bạn có thể sẽ nhận được ứng dụng bị treo ngẫu nhiên khi trong một số hoàn cảnh hộp thoại là không có sẵn nữa ví dụ sau khi xoay màn hình.

Các vấn đề liên quan