0

我想在 AsyncTask 中显示一个 AlertDialog 但它给出了一个错误的令牌异常。上下文由 AsyncTask 的构造函数给出。

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;
        }
    }
}
4

3 回答 3

0

您正在使用警报对话框而不关闭进度对话框。这是在活动中添加窗口的问题,即内存窗口泄漏。

当调用对话框而不关闭先前的对话框时会发生这种情况。

于 2013-10-21T09:42:26.230 回答
0

我认为“上下文”是导致异常的问题。(上下文不是活动)

编辑:

与其在构造函​​数中发送 Context ,不如发送您的 Activity ,这是您的类名。

private Activity activity;
 public TCPHandlerTask(Activity applicationActivity) {
    // TODO Auto-generated constructor stub
    activity = applicationActivity;
} 
于 2012-04-29T12:49:39.887 回答
-1

尝试AlertDialogonPreExecute或 从拨打电话onPostExecute

于 2012-04-29T20:48:04.703 回答