2013-06-12 2 views

Répondre

-1

Ce n'est pas un exemple et je n'ai pas (encore) fait moi-même, mais voici comment je le ferais:

Une façon est d'étendre JsonObjectRequest et sérialisation et la désérialisation chaque tampon de protocole JSON en utilisant:

Message someProto = SomeProto.getDefaultInstance(); 
String jsonFormat = JsonFormat.printToString(someProto); 

Message.Builder builder = SomeProto.newBuilder(); 
String jsonFormat = _load json document from a source_; 
JsonFormat.merge(jsonFormat, builder); 

Voir: https://code.google.com/p/protobuf-java-format/

Sinon, si vous voulez envoyer le tampon protocole serialize à octet [], vous pouvez étendre Request<T>. Le vous devez remplacer public byte[] getBody() pour le corps de la demande/charge utile, et protégé Response<Message> parseNetworkResponse(NetworkResponse response) pour la réponse.

Vous utiliserez ensuite les fonctions suivantes pour sérialiser le tampon de protocole.

byte[] toByteArray(); 

parseFrom(byte[] data); 

Si vous avez une solution, n'oubliez pas de partager.

1

Je l'ai fait, le travail est ok, j'espère qu'il est utile.first créer la classe ProtobufRequest comme ci-dessous qui étend Request, Request est la classe de base requête dans Volley, alors, vous pouvez créer la demande personnalisée étend ProtobufRequest doParse personnalisé(). juste comme référence.

RequestData est SomeProto message,

private static final int SOCKET_TIMEOUT = 30000; 

/** Content type for request. */ 
private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 

private static final Object sDecodeLock = new Object(); 

private RequestData mRequestData; 
private BaseCallback mCallback; 

public ProtobufRequest(RequestData data, BaseCallback callback) { 
    super(Method.POST, Constants.SERVER_URL, callback); 
    // TODO Auto-generated constructor stub 
    mRequestData = data; 
    mCallback = callback; 
    this.setRetryPolicy(getRetryPolicy()); 
} 

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Charset", "UTF-8"); 
    headers.put("Content-Type", "application/x-protobuf"); 
    headers.put("Accept", "application/x-protobuf"); 

    return headers; 
} 

@Override 
public String getBodyContentType() { 
    return PROTOCOL_CONTENT_TYPE; 
} 

@Override 
public RetryPolicy getRetryPolicy() { 
    RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
    return retryPolicy; 
} 

    /** 
    ** write the protobuf data to http request,it is very important 
    */ 
@Override 
public byte[] getBody() throws AuthFailureError { 
    if (mRequestData == null) { 
     return super.getBody(); 
    } else { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 

      baos.write(mRequestData.toByteArray()); 
     } catch (IOException e) { 
      return super.getBody(); 
     } 

     return baos.toByteArray(); 
    } 
} 

@Override 
protected void deliverResponse(Object arg0) { 
    mCallback.onResponse(arg0); 
} 

    /** 
    ** parse the response result 
    */ 
@Override 
protected Response<T> parseNetworkResponse(NetworkResponse response) { 
    synchronized (sDecodeLock) { 
     try { 
      return doParse(response, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (OutOfMemoryError e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

abstract protected Response<T> doParse(NetworkResponse response, Entry entry) 


public interface BaseCallback extends Listener<Object>, ErrorListener { 

} 
-1

juste coller ce ici dans le cas où il est utile: J'ai cherché autour d'un lot pour une façon générique de faire quelque chose de similaire à la réponse de jeff wang. Je n'ai rien trouvé alors j'ai écrit ça. Permettez-moi de savoir si vous avez un moyen de se débarrasser de la distribution non contrôlée là-dedans ...

ProtobufRequest.java

public class ProtoBufRequest<ReqT extends Message, RespT extends Message> extends Request<RespT> { 

    private ReqT request; 
    private final Class<RespT> responseType; 
    private final Listener<RespT> listener; 
    private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 
    private static final int SOCKET_TIMEOUT = 30000; 

    public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, 
         Listener<RespT> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = listener; 
     this.request = data; 
     this.responseType = responseType; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Charset", "UTF-8"); 
     headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); 
     headers.put("Accept", PROTOCOL_CONTENT_TYPE); 

     return headers; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     if (request == null) { 
      return super.getBody(); 
     } 
     return request.toByteArray(); 
    } 


    @Override 
    protected Response<RespT> parseNetworkResponse(NetworkResponse response) { 
     try { 
      if (responseType == null) { 
       throw new IllegalArgumentException("The response type was never provided."); 
      } 
       RespT responseInstance = responseType.newInstance(); 
       return (Response<RespT>) Response.success(
        responseInstance.newBuilderForType().mergeFrom(response.data).build(), 
         HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public RetryPolicy getRetryPolicy() { 
     RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     return retryPolicy; 
    } 

    @Override 
    protected void deliverResponse(RespT response) { 
     listener.onResponse(response); 
    } 
} 
0

De: cmcneil Ajout de code en cas de pourriture lien. Il devrait y avoir une mise en œuvre officielle par Volley ou des tampons de protocole par la suite ainsi s'il vous plaît mettre à jour cela si nécessaire.

import com.android.volley.AuthFailureError; 
import com.android.volley.DefaultRetryPolicy; 
import com.android.volley.NetworkResponse; 
import com.android.volley.ParseError; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.Response.Listener; 
import com.android.volley.RetryPolicy; 
import com.android.volley.toolbox.HttpHeaderParser; 
import com.google.protobuf.MessageLite; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by [email protected] on 5/10/15. 
*/ 
public class ProtoBufRequest<ReqT extends MessageLite, RespT extends MessageLite> extends Request<RespT> { 

    private ReqT request; 
    private final Class<RespT> responseType; 
    private final Listener<RespT> listener; 
    private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 
    private static final int SOCKET_TIMEOUT = 30000; 

    public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, 
          Listener<RespT> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = listener; 
     this.request = data; 
     this.responseType = responseType; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Charset", "UTF-8"); 
     headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); 
     headers.put("Accept", PROTOCOL_CONTENT_TYPE); 

     return headers; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     if (request == null) { 
      return super.getBody(); 
     } 
     return request.toByteArray(); 
    } 


    @Override 
    protected Response<RespT> parseNetworkResponse(NetworkResponse response) { 
     try { 
      if (responseType == null) { 
       throw new IllegalArgumentException("The response type was never provided."); 
      } 
       RespT responseInstance = responseType.newInstance(); 
       return (Response<RespT>) Response.success(
         responseInstance.newBuilderForType().mergeFrom(response.data).build(), 
         HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public RetryPolicy getRetryPolicy() { 
     RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     return retryPolicy; 
    } 

    @Override 
    protected void deliverResponse(RespT response) { 
     listener.onResponse(response); 
    } 
} 
Questions connexes