gpt4 book ai didi

android - FCM onTokenRefresh() 无法在未调用 Looper.prepare() 的线程内创建处理程序

转载 作者:搜寻专家 更新时间:2023-11-01 09:36:24 25 4
gpt4 key购买 nike

我有一个应用程序,它基本上是在调用 API 时使用 Firebase 云消息服务从我自己的服务器获取通知,奇怪的是,当我通过 Android studio RUN 菜单安装它时,它直接将应用程序安装到我的设备上 APP工作正常,但是当我从我的项目目录中取出应用程序调试并手动安装它时,它给了我错误

Can't create handler inside thread that has not called Looper.prepare()

错误指出我的方法是使用 onTokenRefresh() 方法中的 volley 库将数据发送到我的数据库。

我将这些方法放在扩展 FirebaseInstanceIdService 的服务中。

这是完整的错误信息

E/AndroidRuntime: FATAL EXCEPTION: pool-3-thread-1
Process: proizzy.com.qrcodeproizzyadm, PID: 5704
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 android.widget.Toast$TN.<init>(Toast.java:645)
at android.widget.Toast.<init>(Toast.java:137)
at android.widget.Toast.makeText(Toast.java:440)
at proizzy.com.qrcodeproizzyadm.Notification.FirebaseInstanceIDService.onTokenRefresh(FirebaseInstanceIDService.java:25)
at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source)
at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source)
at com.google.firebase.iid.zzb$2.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)

我不知道我的代码出了什么问题。

这是我的服务类的完整代码

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {

@Override
public void onTokenRefresh() {
final String token = FirebaseInstanceId.getInstance().getToken();
Log.v("tok", token);

String tokUrl = "someurl.php";
JsonObjectRequest regToken = new JsonObjectRequest(Request.Method.POST, tokUrl, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.v("success", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.v("errorvolley", error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
params.put("token", token);
return params;
}
};

RequestQueue regQueue = Volley.newRequestQueue(getApplicationContext());
regQueue.add(regToken);

}

最佳答案

好的,所以我已经解决了问题,出于某种原因,如果您从 debug-app 手动安装应用程序,您将收到我在问题中提到的错误。我通过将从 FCM 获得的 token 保存到共享首选项来解决它,稍后当用户登录时,我将 token 发送到我的数据库。这种方式 imo 效率较低,因为用户每次登录时都必须发送 token ,但 token 保持不变(直到他们清除数据或卸载应用程序)。

关于android - FCM onTokenRefresh() 无法在未调用 Looper.prepare() 的线程内创建处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42828503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com