在onPostExecute中我试图显示处理程序,但它给出了异常Activity已泄露的窗口。错误点在代码下方突出显示。这个问题的解决方案是什么。
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 com.android.internal.policy.impl.PhoneWindow$DecorView@40c2d8f8 that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40c2d8f8 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 com.android.internal.policy.impl.PhoneWindow$DecorView@40b35838 that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40b35838 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<<
答案 0 :(得分:1)
当活动有效完成后尝试显示警报时,“活动已泄露最初添加的窗口...”会出现错误。请参阅Activity has leaked window that was originally added。
您有两种选择AFAIK:
答案 1 :(得分:0)
尝试使用DialogFragment而不是仅使用对话框。他们更好地处理生命周期。
答案 2 :(得分:0)
好的,让我给出一些在更新时显示对话框的基本想法,
class Communicator extends AsyncTask<String, Integer, 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)){
publishProgress(LOW_MEMORY);
return (null);
}else{.....
用于显示对话框
protected void onProgressUpdate(Integer... statusCode) {
switch (statusCode[0]) {
case LOW_MEMORY:
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.dismiss();
}
});
alert.setCanceledOnTouchOutside(false);
alert.show();
break;
}
}
希望这会有意义