2017-12-16 10 views
0

Ok 데이터를 데이터베이스와 동기화하는 데 JobScheduler를 사용하고 있습니다. Jobscheduler에서 측정되지 않은 네트워크 등의 작업을 수행 할 수있는 요구 사항을 설정할 수 있지만 Jobscheduler는 인터넷이 작동하는지 점검하지 않습니다. 네트워크에 연결되어 있는지 확인합니다. 나는 여러 가지 일을하는주기적인 1 일을 가지고있다. 인터넷이 있는지 확인하는 비동기 작업을 만들었습니다. http 응답 (StatusCode)이 200과 같지 않은지 확인하고 싶습니다. 즉시 그 일을 멈추고 다시 일정을 잡고 싶습니다. 왜냐하면 인터넷이 작동하지 않는다면 그 일을 계속할 필요가 없기 때문입니다. 비동기 작업이 끝나면 다음 작업이 시작되기 때문에 즉시 작업을 중지하고 일정을 변경하는 방법을 알 수 없습니다.Android JobScheduler가 먼저 interrnet 작업을 확인한 다음 다른 작업을 실행해야합니다.

여기

@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

내 OnStartJob하고 OnStopJob.

인터넷이 작동하지 않는 경우 연결 시간이 초과되어 io 예외가 발생합니다. 오류가 발생하면 부울 일정 변경을 true로 설정하고 코드를 호출해야합니다.

jobFinished(yourparams,rescheduletrue)