如何确定给定的请求是否正在运行?

我正在寻找我的网络层的改造。 是否有任何方法可以判断特定异步请求是否在任何给定时刻运行?

例如,我想知道请求是否正在运行,以便我可以在不同时间更新用户界面。 我可以通过保持variables跟踪状态来自己做这件事,但想知道库中是否已存在某些东西。

在这种情况下,我个人最终做的是我使用Retrofit,Android Priority Jobqueue(来自yigit的fork)和Otto eventbus运行示例。

public enum SingletonBus { INSTANCE; private Bus bus; private Handler handler = new Handler(Looper.getMainLooper()); private SingletonBus() { this.bus = new Bus(ThreadEnforcer.ANY); } public  void postToSameThread(final T event) { bus.post(event); } public  void postToMainThread(final T event) { handler.post(new Runnable() { @Override public void run() { bus.post(event); } }); } public  void register(T subscriber) { bus.register(subscriber); } public  void unregister(T subscriber) { bus.unregister(subscriber); } } public interface Interactor { void injectWith(PresenterComponent presenterComponent); } public interface SendCertificateRequestInteractor extends Interactor { interface Listener { void onSuccessfulEvent(SuccessfulEvent e); void onFailureEvent(FailureEvent e); } class SuccessfulEvent extends EventResult { public SuccessfulEvent(CertificateBO certificateBO) { super(certificateBO); } } class FailureEvent extends EventResult { public FailureEvent(Throwable throwable) { super(throwable); } } void sendCertificateRequest(String username, String password); } 

注意这里的Job

 public class SendCertificateRequestInteractorImpl implements SendCertificateRequestInteractor { private Presenter presenter; private boolean isInjected = false; @Inject public JobManager jobManager; public SendCertificateRequestInteractorImpl(Presenter presenter) { this.presenter = presenter; } @Override public void sendCertificateRequest(String username, String password) { if(!isInjected) { injectWith(presenter.getPresenterComponent()); isInjected = true; } InteractorJob interactorJob = new InteractorJob(presenter, username, password); long jobId = jobManager.addJob(interactorJob); //this is where you can get your jobId for querying the status of the task if you want } @Override public void injectWith(PresenterComponent presenterComponent) { presenterComponent.inject(this); } public static class InteractorJob extends Job { private final static int PRIORITY = 1; private final static String TAG = InteractorJob.class.getSimpleName(); private String username; private String password; @Inject public MyService myService; public InteractorJob(Presenter presenter, String username, String password) { super(new Params(PRIORITY).requireNetwork()); presenter.getPresenterComponent().inject(this); this.username = username; this.password = password; } @Override public void onAdded() { // Job has been saved to disk. // This is a good place to dispatch a UI event to indicate the job will eventually run. // In this example, it would be good to update the UI with the newly posted tweet. } @Override public void onRun() throws Throwable { String certificate = myService.getCertificate(username, password); SingletonBus.INSTANCE.postToMainThread(new SuccessfulEvent(certificate)); } @Override protected void onCancel() { // Job has exceeded retry attempts or shouldReRunOnThrowable() has returned false. Log.e(TAG, "Cancelled job."); } @Override protected boolean shouldReRunOnThrowable(Throwable throwable) { // An error occurred in onRun. // Return value determines whether this job should retry running (true) or abort (false). Log.e(TAG, "Failed to execute job.", throwable); SingletonBus.INSTANCE.postToMainThread(new FailureEvent(throwable)); return false; } } } 

接着

 @Subscribe @Override public void onSuccessfulEvent(SendCertificateRequestInteractor.SuccessfulEvent e) { String certificate = e.getResult(); //do things } @Subscribe @Override public void onFailureEvent(SendCertificateRequestInteractor.FailureEvent e) { Throwable throwable = e.getResult(); //handle error } 

更多关于android priority jobqueue 信息。

这样,从技术上讲,异步处理是指作业队列,而Retrofit本身则使用同步接口。 只要您不需要访问响应的标头,它就能正常工作。 虽然公平,但我也在跟踪作业是否使用布尔值而不是作业管理器和id运行。

此外,我还没有想出如何使用持久化作业正确使用dependency injection; 我也不知道他们打算如何做到这一点。 当然,如果它使用应用程序作用域组件而不是提供的演示者作用域组件,它会工作,但这是无关紧要的。

您可能需要根据自己的方案自定义此解决方案,并仅使用您实际需要的方案。

以下是我需要一种方法来跟踪运行请求时通常会做的事情:

  • 首先,使用改造,一旦发出请求,您可以执行以下操作:
  • 使用EventBus库将事件发布到您的活动或片段。 现在,这可以在你的Callback的onSuccess()方法或者onError()方法中完成。
  • 在您的活动或片段的onEvent(EventClassName事件)方法中,您只需从事件中检查[isRunning]之类的variables,以确保如果事件仍在运行,则相应地更新UI,如果没有,请执行您需要的操作分别做。
  • 请求完成后,显然isRunning将为false,然后您可以按照用户的预期更新UI。
  • 我在这里推荐EventBus只是因为将应用程序代码与它分离起来要容易得多; 您可以发送不同的事件来通知您的请求的不同状态的活动,然后以这种方式更新您的UI。

你可以在这里findEventBus

我希望这有帮助!