简体   繁体   English

Android:AsyncTask中的错误AlertDialog

[英]Android : Error AlertDialog in AsyncTask

I would like to show an AlertDialog in AsyncTask but it gives an bad token exception. 我想在AsyncTask中显示一个AlertDialog,但是它给出了一个错误的令牌异常。 The context is given by the constructor of AsyncTask. 上下文由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
}

Log cat : 日志猫:

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)

Thank's for your answers. 感谢您的回答。

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

I think "context" is the issue that is causing the exception.(Context is not a Activity) 我认为“上下文”是导致异常的问题。(上下文不是活动)

EDITED: 编辑:

Instead of sending Context in constructor, Send your Activity which is your class name. 不是在构造函数中发送Context,而是发送您的Activity(即您的类名)。

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

You are using alert dialog without dismissing progress dialog. 您正在使用警报对话框,而不会关闭进度对话框。 This is the problem add window in activity ie memory window leak. 这是活动中添加窗口的问题,即内存窗口泄漏。

It happens when a dialog is called without dismissing prior dialog. 它发生在调用对话框而不关闭先前的对话框时。

尝试致电AlertDialogonPreExecuteonPostExecute

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM