2012-04-29 47 views
0

我想在AsyncTask中顯示AlertDialog,但它給出了一個錯誤的標記異常。 上下文由AsyncTask的構造函數給出。Android:在AsyncTask中的錯誤AlertDialog

protected void onProgressUpdate(Object... obj) { 
    AlertDialog alert; 
    final CharSequence[] items = {"Run Chat", "Show Position", "Show Infos"}; 
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("Actions"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
    @Override 
     public void onClick(DialogInterface arg0, int arg1) { 
     // TODO Auto-generated method stub 

     } 

    }); 
    builder.show(); //it's give a bad token exception 
} 

登錄貓:

04-29 12:56:57.035: E/AndroidRuntime(1299): Uncaught handler: thread main exiting due to uncaught exception 
04-29 12:56:57.045: E/AndroidRuntime(1299): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.view.ViewRoot.setView(ViewRoot.java:472) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.app.Dialog.show(Dialog.java:239) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.app.AlertDialog$Builder.show(AlertDialog.java:802) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at fr.utbm.aiechat.TCPHandlerTask.onProgressUpdate(TCPHandlerTask.java:98) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.os.Looper.loop(Looper.java:123) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-29 12:56:57.045: E/AndroidRuntime(1299):  at dalvik.system.NativeStart.main(Native Method) 

感謝的爲您解答。

public class TCPHandlerTask extends AsyncTask<Void, Object, Void> 
{ 
    private boolean done; 
    private Network Net; 
    private Context context; 
    private ServerSocket SocketServer; 
    public TCPHandlerTask(Context applicationContext) { 
     // TODO Auto-generated constructor stub 
     context = applicationContext; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     done = false; 
     Net = Network.getInstance(); 
     SocketServer = Net.getSocketServer(); 
    } 

    public void stop() 
    { 
     done = true; 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     while(!done) 
     { 
      try 
      { 
       Socket client = SocketServer.accept(); 
       InputStream is = client.getInputStream(); 
       ObjectInputStream dis = new ObjectInputStream(is); 
       int idPacket = 0; 
       idPacket = dis.readInt(); 
       switch(idPacket) { 
        case Packets.CHANJOIN_REQUEST : 
         System.out.println("Paquet request join"); 

         publishProgress(idPacket); 
        break; 
       } 
       client.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 
    protected void onProgressUpdate(Object... obj) 
    { 
     int idProgress = (Integer) obj[0]; 
     switch(idProgress) { 
      case Packets.CHANJOIN_REQUEST : 
       AlertDialog alert; 
       final CharSequence[] items = {"Lancer Chat", "Voir Position", "Voir Infos"}; 
       AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       builder.setTitle("Actions"); 
       builder.setItems(items, new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         // TODO Auto-generated method stub 

        } 

       }); 
       builder.show(); 
       System.out.println("context4 = "); 
      break; 
     } 
    } 
} 
+0

請包括logcat錯誤日誌。 – 2012-04-29 12:46:06

+0

什麼是'上下文'? – CommonsWare 2012-04-29 12:48:44

+0

上下文由主Activity給出,但aSyncTask在singleton類中實例化。 – user1364017 2012-04-29 13:01:20

回答

0

我認爲「情境」是導致異常的問題(上下文是不是一個活動)

編輯:。

在構造函數發送上下文取而代之的,將您的活動是你的班級名稱。

private Activity activity; 
public TCPHandlerTask(Activity applicationActivity) { 
    // TODO Auto-generated constructor stub 
    activity = applicationActivity; 
} 
+0

是的,我想也是。我如何才能獲得當前的活動?我可以在onProgressUpdate中顯示alertDialog否?謝謝 – user1364017 2012-04-29 12:55:10

-1

嘗試從onPreExecuteonPostExecute致電AlertDialog

+0

'preExecute'和'postExecute'之間有一個主要區別。他們有完全不同的目標 – thepoosh 2012-05-17 08:08:46

0

您正在使用警報對話框而不關閉進度對話框。這是活動中的問題添加窗口,即內存窗口泄漏。

它發生在調用對話框而不關閉之前的對話框時。