0

我的应用程序中有以下要求。1.我选择了一些文件并点击上传按钮。点击上传按钮后,应用程序退出。(我正在排队请求并完成活动)。2. 应用退出后,这些文件需要在后台同步到服务器。3.同样经过一定的时间间隔(我设置了16分钟的间隔),在后台,我需要检查是否有未同步的数据,在后台同步。4. 如果用户离线,一旦建立网络连接,未同步的数据应该在后台同步。

我已经使用 WorkManager 的定期工作请求来实现这一点。但是在我的 Asus Zenfone3 上对其进行测试时,我观察到: 1. 如果我的设备进入睡眠模式,doWork()之后不会执行

  1. 如果我关闭移动数据然后再打开,doWork() 不会立即执行。我设置了 1 个约束:.setRequiredNetworkType(NetworkType.CONNECTED)。它仅在其间隔完成后才执行。我需要在网络上立即同步。

  2. 有时,单击上传按钮不会立即调用 doWork()。

WorkManager (2.3.2) 是我遵循的正确方法吗?实现上述要求的任何指导方针。将不胜感激。

4

2 回答 2

0

如果您阅读 android 文档,工作管理器不是安排重复任务的好方法,并且当设备进入睡眠模式时,正在处理的线程工作管理器也会进入睡眠状态以节省电池,请尝试使用处理程序。 https://developer.android.com/reference/android/os/Handler 在我发布的代码中,我使用了 handler 和 firebase jobdispatcher 以 30 秒的固定间隔记录用户位置,即使设备处于睡眠模式也可以工作

//带有处理程序和firebase作业调度程序的文件

public class GetterService extends JobService {
private HandlerThread handlerThread = new HandlerThread("HandlerThread");
private Handler threadHandler;
int delay = 30*1000;
Runnable runnable;
LocationManager locationManager;

@Override
public boolean onStartJob(@NonNull com.firebase.jobdispatcher.JobParameters job) {
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    handlerThread.start();
    threadHandler = new Handler();
    threadHandler.postDelayed(runnable= () -> {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location repeatedLocations = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        Log.i("location logger", "getting Longitude as "+ repeatedLocations.getLongitude() +" getting Latitide as "+repeatedLocations.getLatitude());
        threadHandler.postDelayed(runnable,delay);
    },delay);
    return false;
}

@Override
public boolean onStopJob(@NonNull com.firebase.jobdispatcher.JobParameters job) {
    return false;
}

}

//带有位置获取器的文件

public class LocationGetter extends AppCompatActivity implements LocationListener {
LocationManager locationManager;
@BindView(R.id.latitudeVal)
TextView latitudeVal;
@BindView(R.id.longitudeVal)
TextView longitudeVal;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 2);
    } else {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, this);
    }
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher
            (new GooglePlayDriver(getApplicationContext()));

    Job notificationJob = dispatcher.newJobBuilder()
            .setService(GetterService.class)
            .setRecurring(true).setTag("jid")
            .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
            .setTrigger(Trigger.executionWindow(1, 10000))
            .setReplaceCurrent(false)
            .build();
    dispatcher.mustSchedule(notificationJob);
}

@OnClick(R.id.ping)
public void onPingClick() {

}

@Override
public void onLocationChanged(Location location) {
    latitudeVal.setText("" + location.getLatitude() + "");
    longitudeVal.setText("" + location.getLongitude() + "");
    Log.i("dfjh", "" + location.getLongitude() + "    " + location.getLatitude());
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

@Override
protected void onDestroy() {
    super.onDestroy();

}

}

于 2020-02-27T07:38:28.603 回答
0

WorkManager 是 Android 上延迟任务的首选解决方案。如果您想要立即采取行动,您可能需要考虑在前台服务中实现您想要的逻辑。

关于设备进入打盹模式时会发生什么,WorkManager 会尽量减少电池消耗并尊重它。同样,如果您需要在设备应该进入打盹模式时执行任务,WorkManager 不是正确的解决方案。但是您需要有充分的理由来证明这种行为的合理性,因为它会对电池寿命产生负面影响。

为了能够了解 Asus Zenfone3 发生了什么,了解您如何将 WorkRequest 和WorkManager 的日志排入队列会很有帮助。

于 2020-02-27T07:32:53.613 回答