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()た。AndroidSDKの状態

現在のプロセスの単一のグローバルApplicationオブジェクトのコンテキストを返します。

この文脈は実際の活動の文脈とは異なると思います。

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()のメイン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 に答える