0

У меня есть класс обслуживания FCM, где я взял токен и отправлю на мой сервер с помощью AsyncTask. Эта ошибка возникает только на устройствах с Android 2.3, чтобы начать мое приложение. Я пытаюсь отправить токен на сервер, даже не запускаю свой AsyncTask. StracktraceAndroid 2.3 Не удается создать обработчик внутри потока, который не вызвал Looper.prepare() (AsyncTask)

Fatal Exception: java.lang.ExceptionInInitializerError 
    at br.lgfelicio.gcm.MyInstanceIDListenerService.sendRegistrationToServer(MyInstanceIDListenerService.java:39) 
    at br.lgfelicio.gcm.MyInstanceIDListenerService.onTokenRefresh(MyInstanceIDListenerService.java:30) 
    at com.google.firebase.iid.FirebaseInstanceIdService.zzag(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:1088) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
    at java.lang.Thread.run(Thread.java:1019) 
Caused by java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Я не понимаю, почему андроид 2.3 эта ошибка происходит, как я могу отправить маркер на мой сервер от этой версии?

Класс FCM Сервис

public class MyInstanceIDListenerService extends FirebaseInstanceIdService { 
private static final String SAVE_ABERTURA = "1"; 
private Armazenamento armazenamento = new Armazenamento(this); 

@Override 
public void onTokenRefresh() { 
    // Get updated InstanceID token. 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

    String tokenFcm = armazenamento.LoadPreferences("tokenFcm"); 

    if (tokenFcm != null && !tokenFcm.equals("") && !refreshedToken.equals(tokenFcm)) { 
     removeTokenFcm(tokenFcm); 
    } 

    // TODO: Implement this method to send any registration to your app's servers. 
    sendRegistrationToServer(refreshedToken); 
} 

private void removeTokenFcm(String tokenFcm) { 
    new RemoveTokenTask(getApplicationContext(), "remove").execute(tokenFcm); 
} 

private void sendRegistrationToServer(String refreshedToken) { 

    new RegistroTokenTask(getApplicationContext(), refreshedToken, "", SAVE_ABERTURA).execute(); 
} 
} 

AsyncTask

public class RegistroTokenTask extends AsyncTask<Void, Void, String> { 

private Context context; 
private String tokenFcm; 
private String key; 

// save = 1 veio do abertura e save = 2 veio do login 
private String save; 

public RegistroTokenTask(Context context, String tokenFcm, String key, String save) { 
    this.tokenFcm = tokenFcm; 
    this.key = key; 
    this.save = save; 
    this.context = context; 
} 

@Override 
protected void onPreExecute() { 
    Log.i("checkin", "teste a: "); 
} 

@Override 
protected String doInBackground(Void... params) { 
    String msg = ""; 

    try { 

     Armazenamento arm = new Armazenamento(context); 

     if (key.trim().equals("")) { 
      key = arm.LoadPreferences("key"); 
     } 

     // url... 

     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc = builder.parse(link); 
     msg = doc.getElementsByTagName("status").item(0).getTextContent(); 

    } catch (Exception e) { 
     Log.i("checkin", "e: " +e.getMessage()); 
    } 

    return msg; 
} 

@Override 
protected void onPostExecute(String result) { 

    // se armazenou o token no banco de dados entao salva no storage 
    if (result.equals("Success") && save.equals("1")) { 

     Armazenamento tokenFcmStorage = new Armazenamento(context); 
     tokenFcmStorage.SavePreferences("tokenFcm", tokenFcm); 
    } 
} 
} 

может кто-то пожалуйста, помогите мне

+0

Возможный дубликат [Невозможно создать обработчик внутри потока, который не называется Looper.prepare() внутри AsyncTask для ProgressDialog] (HTTP://stackoverflow.com/questions/3614663/cant-create-handler-inside-thread-that-has-not-called-looper-prepare-inside-a) – Onik

+0

привет, спасибо за комментарий. Я попытался использовать это решение, которое вы сказали, но не выполняет мою задачу. – ruitercomp

ответ

3

мне удалось найти решение, но я не знаю, если это Лучший. Из того, что я гугле получил этот код в моем классе обслуживания ТСМ:

Handler handler = new Handler(Looper.getMainLooper()); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      new RegistroTokenTask(getApplicationContext(), refreshedToken, "", SAVE_ABERTURA).execute(); 
     } 
    }, 2000); 
Смежные вопросы

 Смежные вопросы