2017-12-16 5 views
0

いいえ私はJobSchedulerを使用してデータベースとデータを同期しています。 Jobschedulerで、測定していないネットワークなどのジョブを実行するための要件を設定できることはわかっていますが、問題はJobschedulerがインターネットが動作しているかどうかを確認することではありません。私は1つの仕事を持っています。それはいくつかの仕事を持っています。私はインターネットがあるかどうかをチェックするこの非同期タスクを作成しました。 httpレスポンス(StatusCode)が200でないかどうかを確認したい。直ちに仕事をやめて、もう一度やり直したい。インターネットが機能していない場合は、ジョブを続行する必要はありません。非同期タスクが完了した後、次のタスクが実行を開始するため、直ちにジョブを停止して再スケジュールする方法を理解できません。Android JobSchedulerは最初にインターネットの動作を確認してから別のタスクを実行する必要があります。

ここにここに私のOnStartJobとOnStopJob

@Override 
public boolean onStartJob(JobParameters jobParameters) { 
    Log.d(TAG, "onStartJob"); 

    new ConnectCheck(getApplicationContext(), this, jobParameters).execute(); 

    getRetrofitObject(); 
    myLocation(); 
    new MyToken(getApplicationContext(), this, jobParameters).execute(); 

    Document newMemo = new Document(); 


    new MyWorker(getApplicationContext(), this, jobParameters).execute(newMemo); 


    return true; 
} 

@Override 
public boolean onStopJob(JobParameters jobParameters) { 
    Log.d(TAG, "onStopJob"); 
    return true; 
} 

は何をやっている私の非同期タスク

private static class ConnectCheck extends AsyncTask<Void, Void, Boolean> { 
    private final Context mContext; 
    private final MyJobService mJobService; 
    private final JobParameters mJobParams; 

    public ConnectCheck(Context context, MyJobService myJobService, JobParameters jobParameters) { 
     mContext = context; 
     mJobService = myJobService; 
     mJobParams = jobParameters; 
    } 

    @Override 
    protected Boolean doInBackground(Void... voids) { 
     Log.d(TAG, "Connect Check start!"); 
     int statusCode = 0; 
     URL url = null; 
     try { 
      url = new URL("http://google.com/"); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     HttpURLConnection http = null; 
     try { 
      http = (HttpURLConnection)url.openConnection(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      statusCode = http.getResponseCode(); 
      Log.d(TAG, "" +statusCode); 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if(statusCode!=200) 
     { 
      // reschedule a jobscheduler 
      Log.d(TAG, "reschedule job"); 
      mJobService.jobFinished(mJobParams, true); 
     } 

     return false; 
    } 

    @Override 
    public void onPostExecute(Boolean reschedule) { 
     if (reschedule) { 
      mJobService.jobFinished(mJobParams, true); 
     } else { 
      mJobService.jobFinished(mJobParams, false); 
     } 
     Log.d(TAG, "ConnectCheck finsished ------------------------"); 
    } 
} 
+0

「私はすぐにジョブを停止し、再スケジュールする方法を見つけ出すカント」 - 呼び出し 'jobFinished()'。 'statusCode!= 200'の場合は、すでにそうしているようです。あなたのステータスコードが200ならば、あなたの実際の作業を行い、完了したら 'jobFinished()'を呼び出します。そして、この 'AsyncTask'を普通の' Thread'に変換し、 'onPostExecute()'を取り除きます。これは、あなたが必要としないか、ここのメインアプリケーションスレッドで作業をしたいからです。 – CommonsWare

答えて

0

ですが、ほぼ正しい道です。

インターネットが動作していないのは、接続がタイムアウトしてioexceptionをスローすることです。それがない場合は、単にtrueにあなたのスケジュール変更ブールを設定し、コードを呼び出す必要があり

jobFinished(yourparams,rescheduletrue) 
関連する問題