如何在Android上使用Retrofit通知每个失败的Httprequest上的单个侦听器

时间:2014-02-05 12:37:28

标签: android retrofit okhttp

我使用Retrofit将我的应用程序连接到webbackend。我们使用异步回调方法在应用程序的不同点执行请求。

如何添加每次http请求失败时收到通知的侦听器。

我目前的想法是创建一个自定义回调类,我的应用程序中的所有回调都必须扩展。每次失败都会通知我的听众。

如果我将所有接口更改为除此类的子类型以外,并使失败和成功方法最终 - 通过回调抽象方法 - 则不可能错过整个应用程序中的调用。

这有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

执行此操作的简单方法是使用回调,但您也可以使用任何事件框架或使用本地事件广播向您的活动发送事件,例如:

  • 发送您必须使用的事件:

        private void sendMessage() {
          Intent intent = new Intent("event-networkerror");
          intent.putExtra("message", "data");
          LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
        }  
    
  • 订阅活动:

        public void onResume() {
          super.onResume();
          // Register mMessageReceiver to receive messages.
          LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
              new IntentFilter("event-networkerror"));
        }
    
        // handler for received Intents for the "my-event" event 
        private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
          public void onReceive(Context context, Intent intent) {
            // Extract data included in the Intent
            String message = intent.getStringExtra("message");
            Log.d("receiver", "Got message: " + message);
          }
        };
    
        protected void onPause() {
          // Unregister since the activity is not visible
          LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
          super.onPause();
        } 
    

您可以使用ErrorHandler发送广播:

        class MyErrorHandler implements ErrorHandler {
          public Throwable handleError(RetrofitError cause) {
            Response r = cause.getResponse();
            // process error r.getStatus()
            Intent intent = new Intent("event-networkerror");
            intent.putExtra("status",r.getStatus());
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            return cause;
          }
        }

        RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("...")
        .setErrorHandler(new MyErrorHandler())
        .build();