使用 WorkManager 的 Android AppWidget 遇到网络问题

Android AppWidget using WorkManager experiencing network issues

提问人:Waking7319 提问时间:1/21/2023 更新时间:1/21/2023 访问量:176

问:

我有一个生产中的应用程序,其中包含一个 AppWidget,它通过 WorkManager 安排定期刷新。我只是从 Retrofit 服务请求一些数据,然后通过 Room DAO 保留这些数据。我收到了数百个网络连接问题的崩溃日志,并报告了小部件不会为他们加载。例外情况通常如下:CoroutineWorkerRefreshWidgetWorker

java.net.UnknownHostException: Unable to resolve host "[my-server]": No address associated with hostname

虽然我也看到:

java.net.SocketTimeoutException: failed to connect to (port ###) from (port #####) after ####

流程如下:

widget onUpdate() gets called (every hour) -> check X duration since last refresh -> schedule RefreshWidgetWorker -> request from remote api -> display widget view -> persist cached data

我的(释义)如下所示:AppWidgetProvider

override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
    GlobalScope.launch {
        if (timeSinceLastRefresh >= refreshThreshold) {
              val initialWorkRequest = OneTimeWorkRequest.Builder(RefreshWidgetWorker::class.java).setInputData(/*requestData*/).build()
              WorkManager.getInstance(context).enqueueUniqueWork(
                    REFRESH_WIDGET_WORK_NAME, ExistingWorkPolicy.KEEP, initialWorkRequest
              )
        }
    }
}

我的样子是:RefreshWidgetWorker

class RefreshWidgetWorker(val context: Context, workerParams: WorkerParameters) :
    CoroutineWorker(context, workerParams), KoinComponent {
    private val dataService: DataService by inject()

    override suspend fun doWork(): Result {
        val d = dataService.getData()
        val views = RemoteViews(context.packageName, R.layout.widget_layout).apply {
            setTextViewText(R.id.textView, d.item)
        }
        AppWidgetManager.getInstance(context).updateAppWidget(widgetId, views)
        cache.put(d)
        return Result.success()
    }

而且只是一个简单的改造服务:DataService

Retrofit.Builder()
        .baseUrl(Constants.API_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
        .client(
            OkHttpClient.Builder().connectTimeout(2, TimeUnit.SECONDS)
                .readTimeout(2, TimeUnit.SECONDS).writeTimeout(2, TimeUnit.SECONDS).build()
        )
        .build()
        .create(DataService::class.java)

我无法在自己的设备上重现此问题,并且不确定这是否与不稳定的移动网络或阻止我的请求通过的系统优化有关。我将不胜感激任何人可能提供的任何见解,因为我已经在这个问题上被难住了一段时间。

retrofit2 android-widget android-workmanager android-networking

评论


答: 暂无答案