1

在不扩展任何其他类的公共类中,我正在做一些评估工作,如果需要向用户传达某些内容,我想返回一个对话框。

我正在使用 AsyncTask 从主 UI 运行此类实例的方法:

private OnlineActivities onlineActivities = new OnlineActivities();

new DoOnlineActivity().execute(getApplicationContext());

private class DoOnlineStuff extends AsyncTask<Context, Integer, Dialog> {
    @Override
    protected Dialog doInBackground(Context... params) {
        return onlineActivities.start(params[0]);
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        Log.v(RuntimeVars.getMyName(), "AsyncOnlineTask in progess");
    }

    @Override
    protected void onPostExecute(Dialog result) {
        if (result != null)
            result.show();
    }
}

现在,使用通过其参数分配的上下文创建对话框的public Dialog start()方法。OnlineActivities.java

当对话框返回给我时,onPostExecute我收到以下异常

11-14 23:53:43.303: ERROR/AndroidRuntime(1320): FATAL EXCEPTION: main
11-14 23:53:43.303: ERROR/AndroidRuntime(1320): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.view.ViewRoot.setView(ViewRoot.java:509)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.app.Dialog.show(Dialog.java:241)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at info.myProject.messaging.ConversationList$DoOnlineActivity.onPostExecute(ConversationList.java:245)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at info.myProject.messaging.ConversationList$DoOnlineActivity.onPostExecute(ConversationList.java:1)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.os.AsyncTask.finish(AsyncTask.java:417)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.os.Looper.loop(Looper.java:123)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at java.lang.reflect.Method.invokeNative(Native Method)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at java.lang.reflect.Method.invoke(Method.java:521)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-14 23:53:43.303: ERROR/AndroidRuntime(1320):     at dalvik.system.NativeStart.main(Native Method)

我想我不能像这样使用上下文。但是有什么选择呢?我怎样才能外包一些我总是需要做的基本事情,甚至是一些一般的对话框?

我是否需要改用自定义意图?

4

2 回答 2

1

不要这样做。将上下文传递给构造函数。然后在你进入后台之前显示活动,然后在之后清除它。

new DoOnlineActivity().execute(getApplicationContext());

private class DoOnlineStuff extends AsyncTask<Void, Integer, Dialog> {

    Context ctx;
    Dialog dialg

    public DoOnlineStuff(Context ctx){

    this.ctx = ctx;

}


    @Override
    protected void onPreExecute(){
    dialg = createdialog;
    dialog.show()
}

    @Override
    protected Dialog doInBackground(Void... void) {
        // Do stuff in background
        publishProgress(0);
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        Log.v(RuntimeVars.getMyName(), "AsyncOnlineTask in progess");
    }

    @Override
    protected void onPostExecute(Dialog result) {
        dialog.dismiss()

}
于 2010-11-15T17:21:50.797 回答
0

我得到了它的一部分工作。问题是getApplicationContext(). Android SDK声明

返回当前进程的单个全局应用程序对象的上下文。

我想这个上下文不同于实际活动的上下文。

因此,当我使用this而不是getApplicationContext()

private OnlineActivities onlineActivities = new OnlineActivities();

new DoOnlineActivity(this).execute();

private class DoOnlineStuff extends AsyncTask<Void, Integer, Dialog> {
    Context ctx;
    Dialog dialog;

    public DoOnlineActivity(Context ctx){
        this.ctx = ctx;
    }

    @Override
    protected Dialog doInBackground(Void... params) {
        return onlineActivities.start(ctx);
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        Log.v(RuntimeVars.getMyName(), "AsyncOnlineTask in progess");
    }

    @Override
    protected void onPostExecute(Dialog result) {
        if (result != null) {
            dialog = result;
            dialog.show();
        }
    }
}

但是:现在我在对话框中创建的按钮不会做任何事情。我猜我的OnClickListener()Dialog 在我的主 ui 的上下文中没有响应:

final View layout = View.inflate(ctx, R.layout.dialog_phonenumber_request, null);
((TextView) layout.findViewById(R.id.label)).setText(ctx.getString(R.string.dialog_insert_self_phonenumber_request_text1));

final EditText savedPhoneNumber = ((EditText) layout.findViewById(R.id.phonenum));
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setIcon(0);
builder.setTitle(ctx.getString(R.string.dialog_insert_self_phonenumber_request_title));

builder.setPositiveButton(ctx.getString(R.string.save),
    new Dialog.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            String toSavePhoneNumber = savedPhoneNumber.getText().toString().trim();

            Database thisDBHandler = new Database(ctx);
            thisDBHandler.open();
            thisDBHandler.insertSetting(RuntimeVars.getDBPhoneNumberName(), toSavePhoneNumber);
            thisDBHandler.close();
        }
    }
);
builder.setView(layout);
return builder.create();

所以最后一步应该是告诉使用OnClickListener()哪个上下文。但这怎么能做到呢?new Dialog.OnClickListener()不会接受任何关于上下文的参数?

谢谢!
S。

于 2010-11-15T21:07:16.290 回答