0

helpshift に最初のメッセージを送信した後、次のスタックを取得しています。私はアンドロイドが初めてで、これをデバッグする方法がわかりません。また、このクラッシュは 5 回に 1 回発生するため、再現方法がわかりません。

0   
java.lang.RuntimeException: An error occured while executing doInBackground()
1   
at android.os.AsyncTask$3.done(AsyncTask.java:300)
2   
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
3   
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
4   
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
5   
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
6   
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
7   
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
8   
at java.lang.Thread.run(Thread.java:818)
9   
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10  
at android.os.Handler.<init>(Handler.java:200)
11  
at android.os.Handler.<init>(Handler.java:114)
12  
at com.helpshift.HSApiData.updateUAToken(SourceFile:1260)
13  
at com.helpshift.Helpshift.registerDeviceToken(SourceFile:641)
14  
at notifications.GCMRegisterCheck$RegisteringHelpShiftWithToken.doInBackground(SourceFile:337)
15  
at notifications.GCMRegisterCheck$RegisteringHelpShiftWithToken.doInBackground(SourceFile:331)
16  
at android.os.AsyncTask$2.call(AsyncTask.java:288)
17  
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
18  
... 4 more
19  
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
20  
at android.os.Handler.<init>(Handler.java:200)
21  
at android.os.Handler.<init>(Handler.java:114)
22  
at com.helpshift.HSApiData.updateUAToken(SourceFile:1260)
23  
at com.helpshift.Helpshift.registerDeviceToken(SourceFile:641)
24  
at notifications.GCMRegisterCheck$RegisteringHelpShiftWithToken.doInBackground(SourceFile:337)
25  
at notifications.GCMRegisterCheck$RegisteringHelpShiftWithToken.doInBackground(SourceFile:331)
26  
at android.os.AsyncTask$2.call(AsyncTask.java:288)
27  
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
28  
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
29  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
30  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
31  
at java.lang.Thread.run(Thread.java:818)
4

1 に答える 1

0

関連するルーパーを含まないスレッドから呼び出しが発生しているため、このクラッシュが発生しています。このクラッシュを止めるには:

  1. ハンドラ スレッドを作成します。
  2. 上記のハンドラ スレッドのルーパーを使用して、レジスタ ハンドラを作成します。
  3. 登録ハンドラー内で API 呼び出しを行います。

非同期タスク内 -

@Override
protected Void doInBackground(Void... voids) {
   HandlerThread handlerThread = new HandlerThread("register-device-token");
   handlerThread.start();
   new RegisterDeviceTokenHandler(handlerThread.getLooper(), context).post(null);
   return null;
}

登録デバイス トークン ハンドラ -

private static class RegisterDeviceTokenHandler extends Handler {

    private final Context context;

    public RegisterDeviceTokenHandler(Looper looper, Context context) {
        super(looper);
        this.context = context;
    }

    @Override
    public void handleMessage(Message msg) {
        Helpshift.registerDeviceToken(context, "hello");
    }
}

その他の質問については、support@helpshift.com までお気軽にお問い合わせください。

于 2015-12-04T11:02:16.640 に答える