android - 方法必须从主线程调用,当前推断线程是worker

标签 android android-architecture-components android-jetpack android-workmanager

我正在尝试每 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/

相关文章:

java - 在主 Activity 中按后退按钮时如何使应用程序退出?

android - 如何在android中为按钮获取类似iphone的动画

android - RoboVM 没有看到我安装了 xCode?

android - 如何在支持 SavedStateHandle 的 AndroidViewModel 中注入(inject)依赖项?

android - 如何避免 MediatorLiveData 的所有源调用同一函数?

android - 如何在 Jetpack Compose 中制作可重用的组件?

android - 如何在满足某些条件的情况下放大/缩小可绘制的 imageView

android - emit 和 emitSource 与 LiveData 之间有什么区别? (如实时用例)

unit-testing - 测试 Worker 实现 (android workmanager)

android - 定期工作请求未在工作管理器中执行 doWork