在onPostExecute我試圖顯示處理程序,但它給予異常活動已泄漏窗口。錯誤點在代碼中突出顯示如下。這個問題的解決方案是什麼?Alertdialog解散之前活動關閉,並給出活動泄露窗口例外
class Communicator extends AsyncTask<String, String, String>
{
int prog = 0;
@Override
protected String doInBackground(String... params) {
String response = null;
try {
if(Login.uname != null && Login.pass != null){
sync(Login.uname, Login.pass);
}else if(SplashScreen.user != null && SplashScreen.pas != null){
sync(SplashScreen.user, SplashScreen.pas);
}
if("ok".equalsIgnoreCase(status))
{
if(memoryInfo(true)){
AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create();
alert.setTitle(R.string.set4Play);
alert.setMessage(getString(R.string.lowMemorySync));
alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();
}else{
new Thread()
{
@Override
public void run()
{
try{
Data.filenames = new ArrayList<String>();
for(int i = 0; i< list.size();i++)
{
if(mname.size() > i)
mnam = mname.get(i);
if(Login.uname != null && Login.pass != null){
mp3Download(Login.uname, Login.pass, list.get(i), mnam);
}
if(SettingActivity.userna != null && SettingActivity.passwo != null){
mp3Download(SettingActivity.userna, SettingActivity.passwo, list.get(i), mnam);
}
publishProgress("" + ((bytecopied1*100)/(totalsize)));
c++;
long b = bytecopied1*100;
float a = b/totalsize;
Message msg = my_handler.obtainMessage();
msg.arg1 = (int)a;
my_handler.sendMessage(msg);
if(list.size() == c){
isTrue = true;
}
}
}catch (Exception e) {
}
super.run();
}
}.start();
}
count ++;
}
else if("tomany".equalsIgnoreCase(status))
{
AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create();
alert.setTitle(R.string.set4Play);
alert.setMessage(getString(R.string.tomany));
alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();
}
else if("fail".equalsIgnoreCase(status))
{
AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create();
alert.setTitle(R.string.set4Play);
alert.setMessage(getString(R.string.connectionerror));
alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent backintent = new Intent(NeliteMusicActivity.this, HomeScreen.class);
startActivity(backintent);
return;
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();
}
totalsize = 0;
for(int i=0; i<list.size(); i++)
{
totalsize += Integer.parseInt(cont.get(i).getSize());
}
} catch (Exception e) {
Log.e("Data.LOG", e.getMessage(), e);
} finally {
}
return response;
}
@Override
protected void onPreExecute() {
prog = 0;
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if ("ok".equalsIgnoreCase(status))
{
sizekb=0;
new Set4Play13(getBaseContext());
sizeall = new Integer[cont.size()];
for (int i = 0; i < cont.size(); i++) {
mixname = cont.get(i).getMixname();
mixnumber = cont.get(i).getNumber();
int size = Integer.parseInt(cont.get(i).getSize());
sizekb= sizekb+size;
sizeall[i] = size;
db.addContact(new Dataset(cont.get(i).getNumber(), cont
.get(i).getUsername(), cont.get(i).getMixname(),
cont.get(i).getSize(), cont.get(i).getUpdate(),
cont.get(i).getKg()));
Log.e("cont.get(i).getKg()", "cont.get(i).getKg()"+cont.get(i).getKg());
}
}
}
private Handler my_handler = new Handler()
{
public void handleMessage(Message msg)
{
int a=msg.arg1;
progress.setProgress(a);
textsync.setText("Syncing mix "+c);
if(progress.getMax()<=a)
{
if (isOnline())
{
AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create();
alert.setTitle(R.string.set4Play);
alert.setMessage(getString(R.string.updatedMix));
alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alert.setButton(getString(R.string.ok),
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
animatedStartActivity();
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();(Here is the Error)
}
if (!isOnline()) {
AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create();
alert.setTitle(R.string.set4Play);
alert.setMessage(getString(R.string.connectionerror));
alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(getApplicationContext(),HomeScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
finish();
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();
}
}
super.handleMessage(msg);
}
};
}
的logcat:
10-13 18:53:20.220: E/WindowManager(4530): Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): at android.view.ViewRoot.<init>(ViewRoot.java:291)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:249)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.Window$LocalWindowManager.addView(Window.java:532)
10-13 18:53:20.220: E/WindowManager(4530): at android.app.Dialog.show(Dialog.java:269)
10-13 18:53:20.220: E/WindowManager(4530): at com.nelitemusic.NeliteMusicActivity$Communicator$1.handleMessage(NeliteMusicActivity.java:372)
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Looper.loop(Looper.java:132)
10-13 18:53:20.220: E/WindowManager(4530): at android.app.ActivityThread.main(ActivityThread.java:4126)
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invokeNative(Native Method)
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invoke(Method.java:491)
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
10-13 18:53:20.220: E/WindowManager(4530): at dalvik.system.NativeStart.main(Native Method)
10-13 18:53:20.220: E/WindowManager(4530): Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): at android.view.ViewRoot.<init>(ViewRoot.java:291)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:249)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
10-13 18:53:20.220: E/WindowManager(4530): at android.view.Window$LocalWindowManager.addView(Window.java:532)
10-13 18:53:20.220: E/WindowManager(4530): at android.app.Dialog.show(Dialog.java:269)
10-13 18:53:20.220: E/WindowManager(4530): at com.nelitemusic.NeliteMusicActivity$Communicator$1.handleMessage(NeliteMusicActivity.java:372)
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Looper.loop(Looper.java:132)
10-13 18:53:20.220: E/WindowManager(4530): at android.app.ActivityThread.main(ActivityThread.java:4126)
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invokeNative(Native Method)
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invoke(Method.java:491)
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
10-13 18:53:20.220: E/WindowManager(4530): at dalvik.system.NativeStart.main(Native Method)
10-13 18:53:20.720: E/<<path>>(4530): >>path<<file://mnt/sdcard/NeliteMusic/sponsormix.mp3
10-13 18:53:20.720: E/<<Login Start>>(4530): >>Login Start<<
10-13 18:53:21.100: E/<<path>>(4530): >>path<<file://mnt/sdcard/NeliteMusic/sponsormix.mp3
10-13 18:53:21.100: E/<<SettingActivity Start>>(4530): >>SettingActivity Start<<
的AsyncTask doInBackground( Params ...)涉及非UI線程來執行任務,因此調用UI執行將產生異常。在你的情況下,你需要去http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress ...) – 2012-08-13 14:00:28
10-13 18:53:20.220:E/WindowManager(4530 ):at com.nelitemusic.NeliteMusicActivity $ Communicator $ 1.handleMessage(NeliteMusicActivity.java:372)< - 你能指出這一行嗎? – Ostkontentitan 2012-08-13 14:03:46
你在doinbackground中做了太多的ui操作,你不應該從這個線程顯示提示對話框 – nandeesh 2012-08-13 14:04:29