private void test() {
String TAG = "tag";
OneTimeWorkRequest a = getRequest(TAG, 1000, "A", TestWorker.class);
OneTimeWorkRequest b = getRequest(TAG, 2000, "B", TestWorker.class);
OneTimeWorkRequest c = getRequest(TAG, 3000, "C", TestWorker.class);
OneTimeWorkRequest d = getRequest(TAG, 4000, "D", TestWorker.class);
WorkManager.getInstance(this)
.enqueue(Arrays.asList(a, b, c, d));
LiveData<List> liveData = WorkManager.getInstance(this).getWorkInfosByTagLiveData(TAG);
liveData.observe(this, new Observer<List>() {
@Override
public void onChanged(List workInfos) {
System.out.println("长度:" + workInfos.size());
for (WorkInfo info : workInfos) {
if (info.getState() == WorkInfo.State.SUCCEEDED) {
Data data = info.getOutputData();
String s = data.getString(DATA);
Long time = data.getLong(TIME, -1);
String id = data.getString(ID);
System.out.println("onChanged:" + id + " " + s + " " + time);
}
}
}
});
System.out.println("UI Main线程Id:" + Thread.currentThread().getId());
//取消任务。
//UUID workId = workRequest.getId();
//WorkManager.getInstance().cancelByWorkId(workId);
}
private OneTimeWorkRequest getRequest(String tag, int time, String id, Class cls) {
//传递的参数数据。
Data data = new Data.Builder()
.putInt(TIME, time)
.putString(ID, id)
.putString(DATA, "phil " + id)
.build();
Constraints constraints = new Constraints.Builder()//触发规则。
.setRequiresStorageNotLow(false)
.setRequiresBatteryNotLow(false)
.setRequiresCharging(false)
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)//对络连接不做要求。
.build();
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(cls)
.setInputData(data)
.setConstraints(constraints)
.addTag(tag)
.build();
return request;
}
}
package zhangphil.demo;
import android.content.Context;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class TestWorker extends Worker {
private String id;
private int time;
public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
Data data = workerParams.getInputData();
time = data.getInt(MainActivity.TIME, -1);
id = data.getString(MainActivity.ID);
String content = data.getString(MainActivity.DATA);
System.out.println("Worker:传入数据->id:" + id + " time:" + time + " data:" + content);
}
/**
-
doWork()函数体已经线程化。
-
@return
*/
@NonNull
@Override
public Result doWork() {
//模拟耗时操作。
SystemClock.sleep(time);
System.out.println("doWork:" + id + "-线程Id:" + Thread.currentThread().getId() + " 完成");
//传输数据给外部监听者。
Data data = new Data.Builder()
.putString(MainActivity.ID, id)
.putString(MainActivity.DATA, "数据回传")
.putLong(MainActivity.TIME, System.currentTimeMillis())
.build();
return Result.success(data);
}
@Override
public void onStopped() {
super.onStopped();
}
}
输出:
15477-15477/? I/System.out: UI Main线程Id:2
15477-15498/? I/System.out: Worker:传入数据->id:A time:1000 data:phil A
15477-15496/? I/System.out: Worker:传入数据->id:B time:2000 data:phil B
15477-15498/? I/System.out: Worker:传入数据->id:C time:3000 data:phil C
15477-15493/? I/System.out: Worker:传入数据->id:D time:4000 data:phil D
15477-15477/? I/System.out: 长度:4
15477-15477/? I/System.out: 长度:4
15477-15502/zhangphil.app I/System.out: doWork:A-线程Id:609 完成
15477-15477/zhangphil.app I/System.out: 长度:4
15477-15477/zhangphil.app I/System.out: onChanged:A 数据回传 1561542140123
15477-15503/zhangphil.app I/System.out: doWork:B-线程Id:610 完成
15477-15477/zhangphil.app I/System.out: 长度:4