首页 > 解决方案 > 它不调用的工人的构造函数?

问题描述

我尝试使用 Work Manager 实现计时器。

“计时器按钮被按下”出现在 logcat 中,但没有来自工人。我做错了什么?

这是我的 ViewModel 类:

public class MainViewModel extends ViewModel {

    public static final String LOG_TAG = "MainActivity";
    private final WorkManager workManager;

    public MainViewModel(WorkManager workManager) {
        this.workManager = workManager;
    }

    public void count() {
        Log.d(LOG_TAG, "Timer button was hit!");

        OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MainWorker.class).build();
        workManager.beginUniqueWork("count-work", ExistingWorkPolicy.APPEND, request).enqueue();
    }
}

这是我的工人。从这里开始,logcat 中没有出现任何内容。我不知道为什么。

public class MainWorker extends Worker {


    public MainWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        Log.d(MainViewModel.LOG_TAG, "Created");
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(MainViewModel.LOG_TAG, "Work start");
        return Result.success();
    }
}

这是我的活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MainViewModel viewModel = new MainViewModel(WorkManager.getInstance(this));
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setMainViewModel(viewModel);
    }
}

标签: javaandroidandroid-workmanager

解决方案


ViewModel 没有按照您的方式进行初始化。如果您必须将某些内容传递给 ViewModel 构造函数,您可能应该考虑使用ViewModelProvider.Factory().

您可以制作自己的 ViewModelProvider.Factory()

参考这个,https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f#:~:text=And%20it%20is%20because% 20you,it%20will% 20create%20your%20ViewModel


推荐阅读