0

特定のステータス コードのエラーを処理する一般的なエラー ハンドラを実装したいと考えています。キューに入れられたすべてのリクエストが同じ動作をすることを望みます。1 つのシナリオは 401 です。401 ステータスが受信されたら、ログイン ダイアログを表示し、そのリクエストを開始したアクティビティがそれについて何も知らなくても元のリクエストを再生したいと考えています。ExecutorDelivery とほぼ同じカスタム ResponseDelivery の実装を検討していました。しかし、これを行ってみると、Request.finish メソッドがパッケージ プライベートであることがわかりました。ボレーでこの種の動作を実装するより良い方法はありますか? ありがとう

4

1 に答える 1

0

私は次から始めます:

public abstract class BaseRequest<T extends ErrorResponse> extends Request<T> {
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        jsonString = new String(response.data);
        T parsedResponse = null;
        try {
            parsedResponse = parseJson(jsonString);
            // this is where you can handle any type of common errors from server
            if (parsedResponse != null && parsedResponse.getErrorCode() == 401) {
                return Response.error(new SessionExpiredError(parsedResponse.getErrorMessage()));
            }
        } catch (JsonSyntaxException e) {
            Ln.e(e, "JsonSyntaxException");
            Ln.e(jsonString);
            return Response.error(new VolleyError(e));
        }

        return Response.success(parsedResponse, HttpHeaderParser.parseCacheHeaders(response));
    }
}

  public class ErrorStatusResponse {
    private int errorCode;
    private String errorMessage;
    ...
}

BaseRequest を拡張するすべてのリクエストは、結果が配信される前に、指定したエラーに対してチェックされます。

先に進むと、コンテキストなしでアクティビティを開始したり、ダイアログを表示したりすることはできません (また、ContextResponseDelivery に渡したくありません。したがって、この目的のために BaseActivity を作成できます。

public abstract class BaseActionBarActivity
        extends ActionBarActivity
        implements Response.ErrorListener {
    @Override
    public void onErrorResponse(VolleyError error) {
      // if your ChildActivitiy wants to override this method, make sure to call super.onErrorResponse 
      if (error instanceof NoConnectionError) {
        noConnection();
      } else if (error instanceof SessionExpiredError) {
        sessionExpired(); // startForResult some LoginActivity here
      } else {
        Ln.e(error);
      }
    }
}

以前のリクエストを再度実行するには、次のようにします。

// ChildActivity
public void fireRequest() {
  api.getMyItemsFromServer();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == SUBACTIVITY_SESSION_EXPIRED) {
    api.getMyItemsFromServer();
  }
}

または、最後に失敗したリクエストを保存しBaseActivityて、その中で処理することができますonActivityResult()

于 2013-10-19T21:22:57.090 に答える