2017-05-13 5 views
0

私は定期的にタスクを実行するasynctaskを定義しています。できます。私は無数の時間をテストしました。しかし何らかの理由で時折クラッシュすることがあります。 stacktraceが非常に曖昧なので、私は問題の原因を見つけることができません。ここでスタックトレースです:まずAsyncTask NoClassDefFoundErrorを引き起こす

Fatal Exception: java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
     at java.lang.Thread.run(Thread.java:856) 
Caused by java.lang.NoClassDefFoundError: android.system.ErrnoException 
     at dita.dev.myportal.SyncManager$GetData.doInBackground(Unknown Source) 
     at dita.dev.myportal.SyncManager$GetData.doInBackground(Unknown Source) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
     at java.lang.Thread.run(Thread.java:856) 

私はProGuardのとjsoupを使用していたので、それはだと思ったが、私はjsoupルールを追加した後、それをテストし、それが動作します。ここでjsoupのための私のルールです:

-keeppackagenames org.jsoup.nodes 
-keep public class org.jsoup.** { 
    public *; 
} 

ここで実行中のタスクです:

private static class GetData extends AsyncTask<Void, Integer, Boolean> { 

     private Context context; 
     private String message; 

     GetData(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected Boolean doInBackground(Void... voids) { 
      String username = Preferences.getString(context, "username"); 
      String password = Preferences.getString(context, "password"); 
      if (username == null) { 
       return false; 
      } 
      PortalCrawler crawler = new PortalCrawler(Config.BASE_URL1); 

      try { 
       crawler.start(username, password); 
       crawler.saveData(); 
       return true; 
      } catch (Exception e) { 
       if (e instanceof SocketTimeoutException || e instanceof UnknownHostException || 
         e instanceof ErrnoException || e instanceof SocketException) { 
        crawler.setBaseUrl(Config.BASE_URL2); 
        try { 
         crawler.start(username, password); 
         crawler.saveData(); 
         return true; 
        } catch (Exception e1) { 
         e1.printStackTrace(); 

         if (e1 instanceof SocketTimeoutException || e1 instanceof UnknownHostException 
           || e1 instanceof ErrnoException || e1 instanceof SocketException) { 
          message = "Unable to connect"; 
         } else { 
          Crashlytics.logException(e.getCause()); 
          message = "An error occurred"; 
         } 
        } 

       } else { 
        e.printStackTrace(); 
        Crashlytics.logException(e.getCause()); 
        message = "An error occurred"; 
       } 

      } 
      return false; 
     } 

     @Override 
     protected void onPostExecute(Boolean success) { 
      if (success) { 
       Preferences.setBoolean(context, "initialSync", true); 
       message = "Sync completed"; 
      } 
      EventBus.getDefault().post(new Events.SyncDone(success, message)); 
     } 
    } 
} 

答えて

1

私は、問題はここにあると信じて:

e instanceof ErrnoException

私はあなたがこれを実行しようとしている疑いがありますアプリケーションがandroid.system.ErrnoExceptionが存在しないpre API-21デバイス上のアプリケーション。それは21に導入されました。

あなたはそれをポスト21 APIに対してコンパイルしましたが、それをプレ21デバイスで実行しようとしています。

+0

私はそれに気づいていませんでした。それはそうでなければなりません。ありがとう。どのように私はそれをキャッチする提案します。原因がロリポップ前のデバイスをサポートしています – Michael

+0

http://stackoverflow.com/questions/3993924/get-android-api-level-of-phone-currently-running-my-application –

関連する問題