gpt4 book ai didi

android-syncadapter - 在 SyncAdapter onPerformSync 中调节网络调用

转载 作者:行者123 更新时间:2023-12-04 08:02:11 25 4
gpt4 key购买 nike

我正在通过 SyncAdapter onPerformSync 发送几个改造调用,并且我试图通过通过 try/catch sleep 语句发送出去来调节 http 调用。但是,这会阻塞 UI,并且只有在所有调用完成后才会响应。

在不阻塞 UI 的情况下,在 onPerformSync 后台调节网络调用(使用 sleep 定时器)的更好方法是什么?

  @Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {

String baseUrl = BuildConfig.API_BASE_URL;

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();

service = retrofit.create(HTTPService.class);

Call<RetroFitModel> RetroFitModelCall = service.getRetroFit(apiKey, sortOrder);
RetroFitModelCall.enqueue(new Callback<RetroFitModel>() {
@Override
public void onResponse(Response<RetroFitModel> response) {
if (!response.isSuccess()) {
} else {
List<RetroFitResult> retrofitResultList = response.body().getResults();
Utility.storeList(getContext(), retrofitResultList);

for (final RetroFitResult result : retrofitResultList) {
RetroFitReview(result.getId(), service);

try {
// Sleep for SLEEP_TIME before running RetroFitReports & RetroFitTime
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
}
RetroFitReports(result.getId(), service);
RetroFitTime(result.getId(), service);
}
}
}

@Override
public void onFailure(Throwable t) {
Log.e(LOG_TAG, "Error: " + t.getMessage());
}
});
}
}

最佳答案

“onPerformSync”代码在“SyncAdapterThread”线程中执行,而不是在主 UI 线程中执行。然而,当使用回调进行异步调用时,这可能会改变(这是我们这里的情况)。

这里您使用的是 Retrofit“call.enqueue”方法的异步调用,这对线程执行有影响。此时我们需要问的问题是:

Where callback methods are going to be executed?



要得到这个问题的答案,我们必须确定哪个 活套将被 使用处理程序 这将发布回调。

如果我们自己使用处理程序,我们可以定义循环器、处理程序以及如何在处理程序之间处理消息/可运行对象。但这一次不同,因为我们使用的是第三方框架(Retrofit)。所以我们要知道Retrofit使用的是哪个looper?

Please note that if Retrofit didn't already define his looper, you could have caught an exception saying that you need a looper to process callbacks. In other words, an asynchronous call needs to be in a looper thread in order to post callbacks back to the thread from where it was executed.



根据Retrofit(Platform.java)的代码源:
static class Android extends Platform {
@Override CallAdapter.Factory defaultCallAdapterFactory(Executor callbackExecutor) {
if (callbackExecutor == null) {
callbackExecutor = new MainThreadExecutor();
}
return new ExecutorCallAdapterFactory(callbackExecutor);
}

static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());

@Override public void execute(Runnable r) {
handler.post(r);
}
}
}

您可以注意到“Looper.getMainLooper()”,这意味着 Retrofit 会将消息/可运行消息发布到主线程消息队列中(您可以对此进行研究以获得更详细的解释)。因此,发布的消息/runnable 将由主线程处理。

话虽如此, onResponse/onFailure 回调将在主线程中执行 .并且它会阻塞 UI,如果你做了太多的工作 (Thread.sleep(SLEEP_TIME);)。您可以自己检查:只需在“onResponse”回调中创建一个断点并检查它正在运行的线程。

So how to handle this situation? (the answer to your question about Retrofit use)



由于我们已经在后台线程(SyncAdapterThread)中,因此在您的情况下无需进行异步调用。只需进行 Retrofit 同步调用,然后处理结果,或记录失败。 这样,您就不会阻塞 UI。

关于android-syncadapter - 在 SyncAdapter onPerformSync 中调节网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35424561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com