2017-03-16 8 views
2

APIが呼び出されるたびにFirebase Cloud Messagingサービスを使用して自分のサーバから通知を受けるアプリがあります。私はそれが私のプロジェクトディレクトリからアプリのデバッグを取って、手動でインストールすると、それは私にエラーを与えるFCM onTokenRefresh()Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません

Can't create handler inside thread that has not called Looper.prepare() 
私はデバイスが私のデバイスに直接インストールされているAndroidのスタジオのランメニューを通じてインストールする

私の方法では、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); 

} 
+0

おそらく、あなたはバックグラウンドスレッドからUIを変更しています。あなたは? – Prashant

+0

@Prashant私didnt、私はアンドロイドスタジオアプリを実行し、それをテストし、それをアンインストールし、私は私のデバイスに手動でインストールされたデバッグアプリをコピーした私にエラーを与えた。 –

答えて

0

OK問題を解決しました。何らかの理由で、アプリケーションを手動でデバッグアプリからインストールすると、私の質問に記載されているエラーが発生します。私はFCMから取得したトークンを共有プリファレンスに保存し、その後ユーザーがログインするとトークンを自分のデータベースに送信して解決しました。この方法では、ユーザーがログインするたびにトークンを送信する必要がありますが、トークンは同じままです(データをクリアしてからアプリをアンインストールするまで)。

0

あなたが私たちに与えてくれたコードでは、エラーを生成するのコードのバージョンではありません。後者はトーストを作ります。 onTokenRefresh()はバックグラウンドスレッドで呼び出され、トーストを直接表示することはできません。

デバイスに正しいバージョンのアプリ(トーストなしのもの)を取得することに問題があります。

関連する問題