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

可能な複製(のhttp:/ /stackoverflow.com/questions/3614663/cant-create-handler-inside-thread-that-has-not-called-looper-prepare-inside-a) – Onik

+0

こんにちは、コメントありがとうございます。私はあなたが言ったが、私の仕事を実行していないこのソリューションを使用してみました。 – ruitercomp

答えて

3

を助けてくださいすることができ、私は解決策を見つけることができたが、それはだ場合、私は知りませんベスト。私は私のクラスのサービスFCMにこのコードを持ってググ何から:

Handler handler = new Handler(Looper.getMainLooper()); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      new RegistroTokenTask(getApplicationContext(), refreshedToken, "", SAVE_ABERTURA).execute(); 
     } 
    }, 2000); 
[ProgressDialogのためのAsyncTask内部Looper.prepare()を呼び出していないスレッド内のハンドラを作成することはできません]の
関連する問題