Как использовать диалог оповещения в обработчике и запустить OnUiThread в Android - PullRequest
0 голосов
/ 28 апреля 2018

Я добавил диалог в ветке, но мой диалог сбой. Может кто-нибудь найти проблему, где я не прав?

Я столкнулся с проблемой, но не нашел этого решения. Я уже проверил эту ссылку: Диалог оповещения от темы - Android

Я добавил этот код в класс MyApplication в моем проекте.

final Handler mHandler = new Handler();

        new Thread(new Runnable() {
            @Override
            public void run () {
                mHandler.post(new Runnable() {
                    @Override
                    public void run () {
                        AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());
                        alert.setTitle(getString(R.string.app_name));
                        alert.setMessage("dsgdgd");
                        alert.setPositiveButton(getString(R.string.app_name), new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                            }
                        });
                        alert.show();
                    }
                });
            }
        }).start();

Моя ошибка: Если я использую Handler, то ниже показывается ошибка.

04-28 15:31:11.999 5498-5558/com.sufalam.baseproject E/AndroidRuntime: FATAL EXCEPTION: Timer-1
    Process: com.sufalam.baseproject, PID: 5498
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:200)
        at android.os.Handler.<init>(Handler.java:114)
        at com.sufalam.baseproject.session.BaseActivity.onSessionLogout(BaseActivity.java:37)
        at com.sufalam.baseproject.session.MyApp$1.run(MyApp.java:24)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)

Использование runOnUiThread:

runOnUiThread(new Runnable() {
            public void run() {
                AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());
                alert.setTitle(getString(R.string.app_name));
                alert.setMessage("dsgdgd");
                alert.setPositiveButton(getString(R.string.app_name), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                    }
                });
                alert.show();

            }
        });

Моя ошибка:

Если я использую runOnUiThread, ниже выводится сообщение об ошибке.

04-28 15:37:31.830 6095-6095/com.sufalam.baseproject E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sufalam.baseproject, PID: 6095
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:694)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
        at android.app.Dialog.show(Dialog.java:316)
        at android.app.AlertDialog$Builder.show(AlertDialog.java:1112)
        at com.sufalam.baseproject.session.BaseActivity$1.run(BaseActivity.java:46)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

1 Ответ

0 голосов
/ 28 апреля 2018

не использовать AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());

использовать AlertDialog.Builder alert = new AlertDialog.Builder(this);

добавив ваш код в новый метод

private void myMethod(AlertDialog.Builder alert){
final Handler mHandler = new Handler();

    new Thread(new Runnable() {
        @Override
        public void run () {
            mHandler.post(new Runnable() {
                @Override
                public void run () {

                    alert.setTitle(getString(R.string.app_name));
                    alert.setMessage("dsgdgd");
                    alert.setPositiveButton(getString(R.string.app_name), new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                        }
                    });
                    alert.show();
                }
            });
        }
    }).start();`}

тогда в вашем вызове onCreate () вот так

AlertDialog.Builder alert = new AlertDialog.Builder(this); myMethod(alert);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...