Android,Retrofit 2:如何每5秒进行一次调用?

3
这是我的代码:

 private void getUserData(){
    //create Retrofit instance
    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create());

    Retrofit retrofit = builder.build();

    //get client & call object for the request
    APIService userService = retrofit.create(APIService.class);

    Map<String, Object> map = new HashMap<>();
    map.put("device_id", Utils.GetDeviceID(DashboardActivity.this));

    Call call = userService.getUser(map);

    //execute network request
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            if(response.isSuccessful() && response.body() != null){
                response.body();
                UserDataManager.$().setUserDataResponse(new com.google.gson.Gson().toJson(response.body()));
                if(UserDataManager.$().getUserData() != null){
                    Log.d(TAG, "USER ID: " + UserDataManager.$().getUserData().getId());
                }
            }
        }

        @Override
        public void onFailure(Call call, Throwable t) {

        }
    });
}

问题:如何每5秒调用此方法,以检查后端是否有新数据到来?

如果有建议和提示,我会很高兴,谢谢。


你应该看一下 rxjava - Samuel Eminet
您可以创建一个调用API的服务,使其在5秒内完成。 - user4571931
4个回答

5
RxAndroid 在这种情况下非常有用。您可以像这样创建循环。
Subscription subscription = Observable.interval(1000, 5000, 
 TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<Long>() {
            public void call(Long aLong) {
                // here is the task that should repeat
            }
        });

如果你想停止循环,只需调用

subscription.unsubscribe()

Action1在Retrofit 2中已被重命名为Consumer。 - Quentin Rufin
@QuentinRufin 我想你的意思是在 RxJava3 中,Action1 已经被重命名为 Consumer,而不是在 Retrofit 中。 - Jack Lynx

1
你可以使用 Handler 实现每 5 秒调用一次。
boolean shouldStopLoop = false;
Handler mHandler = new Handler();

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        getUserData();
        if (!shouldStopLoop) {
            mHandler.postDelayed(this, 5000);
        }
    }
};

并调用 mHandler.post(runnable); 开始调用。


目前我已经实现了这个功能,但不确定这个解决方案是否正确。 - Giorgi Asaturyan
是的,我认为每隔5秒轮询服务器以检查新数据并不是一个好决定。如果服务器可以在有新数据时向应用程序推送通知,那将更好。 - pradithya aria
是的,我也这么认为。那么您有什么想法,如何在 Android 作为前端,PHP 和 MySQL 作为后端的情况下实现这种解决方案呢? - Giorgi Asaturyan
2
一个解决方案是使用 FCM,另一个是使用 Web Socket。 - pradithya aria

1

WorkManager 将帮助您检查 文档


1
OP想要每5秒安排一次工作,但是WorkManager文档说:“周期性工作的最小间隔为15分钟。” https://developer.android.com/reference/kotlin/androidx/work/PeriodicWorkRequest - Abdul Mateen

0
Completable.timer(5, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::doYourThing, this::onError)) 

但更好的选择是询问您的后端开发人员,在数据更改时发送Firebase通知,因为网络调用是昂贵的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接