【发布时间】: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