线程内部的Looper.prepare()错误

时间:2016-06-12 12:55:30

标签: java android multithreading android-studio android-asynctask

我正在使用处理程序来获取GCM值 我想在我的数据库中更新这个值

所以我从处理程序中调用AsyncTask

但我收到此错误

java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序

我检查了其他解决方案,他们说我必须把代码放在我已经做过的run()部分中。

这是代码,

private void GetGCM(final String UserID) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext());
                String gcmRegID = "";
                gcmRegID = gcmRegistrationHelper.GCMRegister("123456");

                // Update using Web Service
                try {
                    UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask();


                    updateGCMWSTask.execute(UserID, gcmRegID);
                    // ************ HERE IS THE ERROR ***********************

                }catch (Exception e)
                {
                    e.printStackTrace();
                }


            } catch (Exception bug) {
                bug.printStackTrace();
            }
        }
    });


    thread.start();
}

2 个答案:

答案 0 :(得分:1)

您无法在线程内创建asynctask。处理它的方法很少:

  1. 创建一个新的处理程序。

  2. 调用函数runOnUIThread of activity。

  3. 使用广播。

答案 1 :(得分:1)

在代码中添加Looper.prepare()和Looper.loop(),如下所示:

private void GetGCM(final String UserID) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Looper.prepare();
                GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext());
                String gcmRegID = "";
                gcmRegID = gcmRegistrationHelper.GCMRegister("123456");

                // Update using Web Service
                try {
                    UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask();


                    updateGCMWSTask.execute(UserID, gcmRegID);
                    // ************ HERE IS THE ERROR ***********************

                }catch (Exception e)
                {
                    e.printStackTrace();
                }

              Looper.loop();
            } catch (Exception bug) {
                bug.printStackTrace();
            }
        }
    });

    thread.start();
}