2013-06-12 56 views

回答

-1

這並不是一個例子,我還沒有(還)做自己,但這裏是我會怎麼做:

的方法之一是擴大JsonObjectRequest和序列化,並使用反序列化每個協議緩衝區JSON:

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); 

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

否則,如果你要發送的協議緩衝序列化的byte []可以擴展Request<T>。您將覆蓋請求正文/有效內容的public byte[] getBody(),並且 保護Response<Message> parseNetworkResponse(NetworkResponse response)獲得答案。

然後,您將使用以下函數序列化協議緩衝區。

byte[] toByteArray(); 

parseFrom(byte[] data); 

如果您有解決方案,請不要忘記分享。

1

我已經做好了,工作很好,希望它有幫助。首先創建如下的ProtobufRequest類,繼承Request,Request是基本的請求類,然後​​,你可以創建自定義請求extends ProtobufRequest做自定義的doParse()。只是作爲參考。

是的RequestData消息SomeProto,

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

以防萬一,在這裏堅持這一點,是非常有用的: 我搜索周圍很多的普通的方式做類似jeff wang的答案的東西。我找不到任何東西,所以我寫了這個。 讓我知道,如果你有什麼辦法來擺脫在那裏選中投...

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

來源:cmcneil添加的代碼的情況下,鏈接腐爛。最終應由Volley或Protocol Buffers正式實施,因此請在必要時更新。

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); 
    } 
}