【问题标题】:Looper.prepare() error inside a thread线程内的 Looper.prepare() 错误
【发布时间】:2016-06-12 12:55:29
【问题描述】:

我正在使用处理程序来获取 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();
}

【问题讨论】:

  • 我不太相信这段特定的代码需要一个显式的后台线程...
  • 我已经尝试编写 GCM 代码超过 2 周了,这是唯一对我有用的方法,现在我只想将代码保存在数据库中。
  • 正如我所说,我不明白为什么,但这可能是我缺乏理解。 GCMHelper 来自哪里,它有什么作用?看起来代码尝试在主(UI)线程上做一些同步的事情。但是如果你已经有一个工作线程,为什么还要额外的AsyncTask?或者只是简短:我不明白,但不知何故它看起来不对。
  • GCMHelper 是一个获取 GCM 代码的类,第二部分是将此代码保存在数据库中,这就是我使用 UpdateGCMWSTask AsyncTask 的原因,这就是我得到错误的地方
  • 啊,我明白了。 GCM 方法是同步的,您不能在 UI 线程上调用它们,因为它们是阻塞的。我会尝试将 run() 块单独移动到 AsyncTask 中。如果您仍然需要UpdateGCMWSTask,请从onPostExecute() 运行它。您的自定义后台线程没有消息循环器,我认为没有必要创建一个。

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


【解决方案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();
}

【讨论】:

    【解决方案2】:

    您不能在线程内创建异步任务。有几种处理方法:

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

    2. 调用activity的runOnUIThread函数。

    3. 使用广播。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2011-08-23
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多