我正在尝试每 15 分钟更换一次 Android 壁纸或类似的内容。用户可以选择时间,我正在使用 Workmanager 运行定期工作。
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(SomeWorker.class, 15, TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
这样我就可以调用我的 worker 类(Class)了。 worker 类(Class)就是这样
public class SomeWorker extends Worker {
Context context = getApplicationContext();
private String URL;
@NonNull
@Override
public Result doWork() {
new FetchWallpaper().execute();
return Result.SUCCESS;
}
private class FetchWallpaper extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... voids) {
try
{
URL = "myurl.com";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(URL)
.build();
Response responses = null;
try {
responses = client
.newCall(request)
.execute();
String jsonData = responses.body().string();
JSONArray jsonArr = new JSONArray(jsonData);
JSONObject c = jsonArr.getJSONObject(new Random().nextInt(jsonArr.length()));
String imageUrl = c.getString("wallpaper");
Bitmap result= Picasso.with(getApplicationContext())
.load(imageUrl)
.get();
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
wallpaperManager.setBitmap(result);
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
Date currentTime = Calendar.getInstance().getTime();
}
catch (Exception e)
{
Date currentTime = Calendar.getInstance().getTime();
}
return null;
}
}}
在那条特定的线上,
new FetchWallpaper().execute();
我收到错误消息,指出它必须从主线程调用。我是 Android 新手,不知道这是否是个好方法。 请让我知道是否有更好的方法来执行此类任务。
最佳答案
Worker
类已经在后台线程上调用 doWork
- 您根本不需要使用 AsyncTask
。
只需将 doInBackground
方法中的所有内容直接移至 Worker 的 doWork
中即可。
关于android - 方法必须从主线程调用,当前推断线程是worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51806176/