[英]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. 它发生在调用对话框而不关闭先前的对话框时。
尝试致电AlertDialog
从onPreExecute
或onPostExecute
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.