FCM onTokenRefresh () Looper.prepare () deb nomlanmagan ishlovchilar ichida ishlov beruvchini yaratib bo'lmadi

Ilova mening apparatimdan Firebase Cloud Messaging xizmatidan foydalangan holda API-ni chaqirgan har bir dasturdan foydalansam, u Android-ning studiyasini ishga tushirish menyusi orqali o'rnatganida g'alati bo'lib, ilovani to'g'ridan-to'g'ri qurilmamga o'rnatadi, APP ishlayapti , lekin men loyiha katalogidan ilovani disk raskadrovka qilsam va uni qo'lda o'rnatgan bo'lsam, u menga xato beradi

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

xato onTokenRefresh() usulida volley kutubxonasidan foydalanib ma'lumotlar bazasiga ma'lumot yuborish usulini ko'rsatadi.

Ushbu usullarni FirebaseInstanceIdService xizmatini kengaytiradigan xizmatni ishga solaman.

bu to'liq xato xabari

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.(Handler.java:200)
   at android.os.Handler.(Handler.java:114)
   at android.widget.Toast$TN.(Toast.java:645)
   at android.widget.Toast.(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)

Men kodi bilan noto'g'ri ketgan har qanday maslahatim yo'q.

bu men xizmat ko'rsatish klassining to'liq kodim

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() {
                @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 getParams() {
            Map params = new HashMap<>();
            params.put("token", token);
            return params;
        }
    };

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

}
2
@Prashan qilmadim, men Android dasturini ishga tushirdim, uni sinovdan o'tkazdim va uni o'chirib tashladim, xatolarni tuzatuvchi ilovani qurilmaga qo'l bilan nusxalashdi, bu menga xato berdi.
qo'shib qo'ydi muallif Achmad Naufal Syafiq, manba
@Prashan qilmadim, men Android dasturini ishga tushirdim, uni sinovdan o'tkazdim va uni o'chirib tashladim, xatolarni tuzatuvchi ilovani qurilmaga qo'l bilan nusxalashdi, bu menga xato berdi.
qo'shib qo'ydi muallif Achmad Naufal Syafiq, manba
Ehtimol, siz UIni fon toifasidan o'zgartirasiz. Senchi?
qo'shib qo'ydi muallif Prashant, manba
Ehtimol, siz UIni fon toifasidan o'zgartirasiz. Senchi?
qo'shib qo'ydi muallif Prashant, manba

6 javoblar

OK, shuning uchun muammolarni hal qildim, chunki nima uchun ilovani qo'lda nosozliklarni tuzatuvchi ilovadan yuklasangiz, xato haqida mening savolimda aytib o'tilganidek olasiz. men buni FCM dan umumiy imtiyozga ega bo'lgan va undan keyin foydalanuvchi kirganida tokenni ma'lumotlar bazasiga yuborish orqali tozalab, uni hal qildim. foydalanuvchi imo-ishorani har safar kiritishi kerak bo'lganligi sababli imo kamroq samaraliroq bo'ladi, biroq token bir xil bo'ladi (ma'lumotlar o'chirilgunicha yoki ilovani o'chirmasdan).

1
qo'shib qo'ydi

OK, shuning uchun muammolarni hal qildim, chunki nima uchun ilovani qo'lda nosozliklarni tuzatuvchi ilovadan yuklasangiz, xato haqida mening savolimda aytib o'tilganidek olasiz. men buni FCM dan umumiy imtiyozga ega bo'lgan va undan keyin foydalanuvchi kirganida tokenni ma'lumotlar bazasiga yuborish orqali tozalab, uni hal qildim. foydalanuvchi imo-ishorani har safar kiritishi kerak bo'lganligi sababli imo kamroq samaraliroq bo'ladi, biroq token bir xil bo'ladi (ma'lumotlar o'chirilgunicha yoki ilovani o'chirmasdan).

1
qo'shib qo'ydi

Siz bizga bergan kod bu xato ishlab chiqaradigan kod versiyasi emas. Ikkinchisi esa tushlik yaratmoqda. onTokenRefresh() fon fonida chaqiriladi va to'g'ridan to'g'ri Toastni ko'rsatolmaydi.

Qurilmangizda ilovangizning to'g'ri versiyasini (Toastsiz holda) olish haqida o'ylang va muammo ketadi.

0
qo'shib qo'ydi

Siz bizga bergan kod bu xato ishlab chiqaradigan kod versiyasi emas. Ikkinchisi esa tushlik yaratmoqda. onTokenRefresh() fon fonida chaqiriladi va to'g'ridan to'g'ri Toastni ko'rsatolmaydi.

Qurilmangizda ilovangizning to'g'ri versiyasini (Toastsiz holda) olish haqida o'ylang va muammo ketadi.

0
qo'shib qo'ydi

Sizda bo'lgan muammolar, ishchi/fonda ishlayotgan vaqtingizda mos kelmaydigan vazifani bajarishga harakat qilmoqdasiz. Yon suzgichlarda ko'rganingizdek, siz (tizim) faqatgina "asosiy" dan chaqirilishi mumkin bo'lgan "         android.os.Handler. (Handler.java:114) Foydalanuvchining profili biznes : quyidagi kabi cheklarni qo'shing:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
   //do stuff that is allowed on main thread
} else {  
   //do stuff that is allowed on background thread
}
0
qo'shib qo'ydi

Sizda bo'lgan muammolar, ishchi/fonda ishlayotgan vaqtingizda mos kelmaydigan vazifani bajarishga harakat qilmoqdasiz. Yon suzgichlarda ko'rganingizdek, siz (tizim) faqatgina "asosiy" dan chaqirilishi mumkin bo'lgan "         android.os.Handler. (Handler.java:114) Foydalanuvchining profili biznes : quyidagi kabi cheklarni qo'shing:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
   //do stuff that is allowed on main thread
} else {  
   //do stuff that is allowed on background thread
}
0
qo'shib qo'ydi