Java 为什么此alertView不生成并导致应用程序崩溃?

Java 为什么此alertView不生成并导致应用程序崩溃?,java,android,listview,Java,Android,Listview,我想知道我的代码有什么问题,或者我的代码中缺少了什么。以下是我的设想: 对于从BaseAdapter派生的数据,我有一个ListView和一个CustomAdapter 我已经为每个项目创建了自定义视图 在这个自定义视图(也称为单元格)中,我应用了longClickListener。长时间按下单元格后,长时间单击的方法被成功调用。在这里之前没有问题 但是,当我在这个方法中添加生成AlertDialog的代码时,AlterDialog将永远不会生成整个应用程序并使其崩溃 我尝试在类外部创建另一个方

我想知道我的代码有什么问题,或者我的代码中缺少了什么。以下是我的设想:

对于从BaseAdapter派生的数据,我有一个ListView和一个CustomAdapter

我已经为每个项目创建了自定义视图

在这个自定义视图(也称为单元格)中,我应用了longClickListener。长时间按下单元格后,长时间单击的方法被成功调用。在这里之前没有问题

但是,当我在这个方法中添加生成AlertDialog的代码时,AlterDialog将永远不会生成整个应用程序并使其崩溃

我尝试在类外部创建另一个方法,该方法现在保存alertDialog生成。然后我从longClickListener的接口方法调用这个外部方法。但还是一样的崩溃

然后我尝试通过Runnable创建整个alertDialog,并在1秒后通过处理程序启动Runnable,但alertDialog从未生成并导致应用程序崩溃

以下是到目前为止的代码:

void called()
    {
        Handler h = new Handler();
        Runnable r = new Runnable(){
            @Override
            public void run()
            {
                Log.d("mx", "about to run!");
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(FolderCell.this.getContext());
                alertDialogBuilder
                    .setTitle("title")
                    .setMessage("message")
                    .setCancelable(false)
                    .setNegativeButton("OK",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            dialog.cancel();
                        }
                    });

                    AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();
            }
        };

        h.postDelayed(r, 1000);
    }

    @Override
    public boolean onLongClick(View arg0) {
        // TODO Auto-generated method stub
        Log.d("mx", "Long clicked!");

        this.called();

        return true;
    }
事故日志:

08-23 23:40:39.734: E/AndroidRuntime(32390): FATAL EXCEPTION: main
08-23 23:40:39.734: E/AndroidRuntime(32390): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:589)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.app.Dialog.show(Dialog.java:277)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at com.rdmteq.pic_measure.FolderCell$2.run(FolderCell.java:216)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.os.Handler.handleCallback(Handler.java:615)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.os.Looper.loop(Looper.java:137)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at android.app.ActivityThread.main(ActivityThread.java:4794)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at java.lang.reflect.Method.invokeNative(Native Method)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at java.lang.reflect.Method.invoke(Method.java:511)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
08-23 23:40:39.734: E/AndroidRuntime(32390):    at dalvik.system.NativeStart.main(Native Method)
有关FolderCell在继承权中的位置的其他信息

MainActivity (Activity Class)
    |
    contains--> ListView (ListView Class)
            |
            --> CustomAdapter (BaseAdapter Class) and set to ListView
                   |                    
                   contains-> FolderCell (RelativeLayout Class) generated in getView(..) 

有人能帮我吗?

你可以尝试使用
FolderCell.this
而不是
FolderCell.this.getContext()

并检查这是否在主线程中工作。

您试图从非UI线程的线程显示一个
警报对话框


要执行所需操作,必须使用
处理程序
异步任务
(在
onPostExecute()上显示
警报对话框
方法。在我看来,
AsyncTask
方法更简单。

确保您正在将当前正在运行的活动上下文传递给
AlertDialog。Builder
Constructor通过将引用传递到单元格来尝试从应用程序传递上下文。我也尝试了传递单元格的上下文。但仍然会崩溃…FolderCell。这使它成为一个错误。并且程序没有编译。'FolderCell.this'-是一个主类?你能给出所有的类代码吗?我编辑了我的问题,以进一步显示FolderCell所在位置的详细信息。嗯……真的很奇怪。也许你可以尝试这样做:-放入FolderCell-MainActivity上下文中(和此上下文尝试用于创建对话框)-如果这不起作用-尝试:((活动)您的_main_Activity_context)。createDialogMethod()和createDialogMethod()-这是MainActivity类函数,您应该在其中放置“调用”CreateDialog函数的代码: