2017-11-27 14 views
11

Như Từ căn cứ hỏa lực JobDispatcher Documentation Firebase JobDispatcherTại sao Firebase JobDispatcher chạy JobService 2 lần?

setTrigger(Trigger.executionWindow(0, 60)) 
// start between 0 and 60 seconds 

nhưng tại sao sevice của tôi chạy hai lần

căn cứ hỏa lực JobDispacther Mã

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this)); 
    Job job = dispatcher.newJobBuilder() 
      .setTag("testing job") 
      .setService(TestingJob.class) 
      .setReplaceCurrent(true) 
      .setRecurring(true) 
      .setTrigger(Trigger.executionWindow(0,1)) 
      .setConstraints(Constraint.ON_ANY_NETWORK) 
      .setLifetime(Lifetime.FOREVER) 
      .build(); 

    dispatcher.mustSchedule(job); 

kiểm tra lớp (J ob Service)

public class TestingJob extends JobService { 

    private static final String TAG = "TestingJob"; 
    private int i =0; 
    @Override 
    public boolean onStartJob(JobParameters job) { 

     Log.d(TAG, "onStartJob Testing Job: "+new Date().toString()); 
     Log.d(TAG, "onStartJob: i = "+String.valueOf(i)); 
     i+=1; 
     return false; 
    } 

    @Override 
    public boolean onStopJob(JobParameters job) { 

     Log.d(TAG, "onStopJob Testing Job: Stopped"); 
     return false; 
    } 
} 

Log Cát

11-28 00:08:57.666 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017 
11-28 00:08:57.666 11793-11793: onStartJob: i = 0 
11-28 00:08:57.791 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017 
11-28 00:08:57.791 11793-11793: onStartJob: i = 0 

Manifest

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <service android:name=".services.TestingJob" 
      android:exported="false"> 
     <intent-filter> 
      <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/> 
     </intent-filter> 
    </service> 

tôi có thể sử dụng dịch vụ việc làm của tôi lần nữa có nghĩa là int i sẽ tăng mỗi lần.

Thnx Để được trợ giúp của bạn

+1

Tôi đã đấu tranh với cùng một vấn đề, tuy nhiên, tôi đang sử dụng URI nội dung làm trình kích hoạt. Vấn đề đã xảy ra trên cả hai thiết bị tôi thử nghiệm, nhưng nếu tôi xây dựng ứng dụng trong môi trường mô phỏng, nó chỉ chạy một lần. –

Trả lời

3

Tôi nghĩ rằng một số phương pháp chúng ta nên biết về nó

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this)); 
    Job job = dispatcher.newJobBuilder() 
      .setTag("testing job") 
      .setService(TestingJob.class) 
      .setReplaceCurrent(true) 
      .setRecurring(true) 
      .setTrigger(Trigger.executionWindow(0,1)) 
      .setConstraints(Constraint.ON_ANY_NETWORK) 
      .setLifetime(Lifetime.FOREVER) 
      .build(); 

    dispatcher.mustSchedule(job); 

trong này bạn thiết lập
.setRecurring(true): có nghĩa là lặp lại nó liên tục. thiết lập kích hoạt với sự khởi đầu và kết thúc .setTrigger(Trigger.executionWindow(start, end)):

bắt đầu: được biết như windowStart, đó là thời gian sớm nhất (tính bằng giây) công việc cần được xem xét đủ điều kiện để chạy. Được tính từ thời điểm công việc đã được lên lịch (đối với công việc mới)

end: được gọi là windowEnd, Thời gian mới nhất (tính bằng giây) công việc sẽ được chạy trong một thế giới lý tưởng. Tính theo cách tương tự như windowStart.

.setReplaceCurrent(false): điều đó có nghĩa là không ghi đè công việc hiện có bằng cùng một thẻ.

Hy vọng nó sẽ giúp bạn !!

+0

thnx để được trợ giúp của bạn :) – Salman500

+0

@ Salman500 welcome !! –

2

Tôi nghĩ lý do tại sao nó chạy 2 lần là cửa sổ thực thi của bạn.

.setTrigger(Trigger.executionWindow(0,1)) 

Chỉ có cửa sổ thời gian 1 giây. Hãy thử với khoảng thời gian rộng hơn, chẳng hạn như (0, 60), điều đó sẽ thực hiện thủ thuật.

Để trả lời câu hỏi khác của bạn về biến của bạn i, bạn phải làm cho nó tĩnh:

private static int i = 0; 
+0

làm thế nào tôi có thể chạy dịch vụ việc làm của tôi mãi mãi – Salman500

+0

bạn có biết bất kỳ tài liệu cho căn cứ hỏa lực JobDispatcher không phải từ github vừa và bất kỳ tài nguyên khác thnx cho câu trả lời @VollyNoob – Salman500

+0

0,60 cũng đang chạy hai lần TestingJob: onStartJob Testing Job : Thứ năm 30 tháng 11 16:25:27 GMT + 05: 00 2017 TestingJob: onStartJob: i = 0 TestingJob: onStartJob Thử nghiệm công việc: ngày 30 tháng 11 16:25:27 GMT + 05: 00 2017 TestingJob: onStartJob: i = 0 – Salman500

1

bạn int i sẽ không tăng mỗi lần.

setTrigger(Trigger.executionWindow(0, 60)) 

Và JobTrigger này sẽ xác định Công việc đã tạo hiện đã sẵn sàng để thực thi. Bạn đã chỉ định một cửa sổ thực hiện từ 0 đến 1 giây. Đó là lý do tại sao công việc của bạn được kích hoạt sau mỗi giây.

Việc kích hoạt này rất quan trọng vì công việc lặp lại luôn cần kích hoạt cửa sổ thực thi. Tất nhiên, nếu công việc của bạn không định kỳ, bạn không phải đặt bất kỳ kích hoạt nào cho nó.

Tham số đầu tiên của bạn là khoảng thời gian tính bằng giây giữa 2 công việc và tham số thứ hai là khoảng thời gian + thời gian đồng bộ trong vài giây.

Các vấn đề liên quan