2016-09-13 14 views
0

を拡張するカスタムVolleyRequestクラスを作成しました。ここでそのカスタムクラスのコードは次のとおりです。Android Volley getParamsがカスタムリクエストで呼び出されていない

public class MultipartRequest extends Request<NetworkResponse> { 
    private final Response.Listener<NetworkResponse> mListener; 
    private final Response.ErrorListener mErrorListener; 
    private final Map<String, String> mHeaders; 
    private final Map<String, String> mParams; 
    private final String mMimeType; 
    private final byte[] mMultipartBody; 

    public MultipartRequest(String url, Map<String, String> headers, Map<String, String> params, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) { 
     super(Method.POST, url, errorListener); 
     this.mListener = listener; 
     this.mErrorListener = errorListener; 
     this.mHeaders = headers; 
     this.mParams = params; 
     this.mMimeType = mimeType; 
     this.mMultipartBody = multipartBody; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Log.i("MultipartRequest", "headers = " + mHeaders); 
     return mHeaders; 
    } 

    @Override 
    protected Map<String, String> getParams() throws AuthFailureError { 
     Log.i("MultipartRequest", "params = " + mParams); 
     return mParams; 
    } 

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

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     return mMultipartBody; 
    } 

    @Override 
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) { 
     try { 
      return Response.success(
       response, 
       HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    protected void deliverResponse(NetworkResponse response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    public void deliverError(VolleyError error) { 
     mErrorListener.onErrorResponse(error); 
    } 
} 

私は、彼らが次のようにproperly.Iが要求を作成すると呼ばれていることを確認するためにgetHeaders()getParams()Log.i文を挿入しています

final Map<String, String> volleyParams = new HashMap<>(); 
volleyParams.put("size", String.valueOf(data.imageSize)); 
volleyParams.put("width", String.valueOf(data.imageWidth)); 
volleyParams.put("height", String.valueOf(data.imageHeight)); 
volleyParams.put("isIndex", updateProfilePhoto ? "1" : "0"); 

final Context context = this; 
final String twoHyphens = "--"; 
final String lineEnd = "\r\n"; 
final String boundary = "apiclient-" + System.currentTimeMillis(); 
final String mimeType = "multipart/form-data;boundary=" + boundary; 
byte[] multipartBody = new byte[0]; 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(bos); 
try { 
    // the first file 
    buildPart(dos, data.thumbnailImageArray, "file0"); 
    // the second file 
    buildPart(dos, data.scaledImageArray, "file1"); 
    // send multipart form data necesssary after file data 
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
    // pass to multipart body 
    multipartBody = bos.toByteArray(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Map<String, String> headers = new HashMap<String, String>(); 
headers.put("User-Agent", Authentication.getUserAgent()); 
headers.put("X-XX-API", Authentication.getKey()); 

MultipartRequest multipartRequest = new MultipartRequest(BASE_URL + "member/photos", headers, volleyParams, mimeType, multipartBody, new Response.Listener<NetworkResponse>() { 
    @Override 
    public void onResponse(NetworkResponse response) { 
     Log.i(LOG_TAG, "response: " + response); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     Log.i(LOG_TAG, "statusCode = " + error.networkResponse.statusCode); 
     Log.i(LOG_TAG, "data = " + error.networkResponse.data); 
     Log.i(LOG_TAG, "headers = " + error.networkResponse.headers); 
     Log.i(LOG_TAG, "notModified = " + error.networkResponse.notModified); 
     Log.i(LOG_TAG, "networkTimeMs = " + error.networkResponse.networkTimeMs); 
     } 
    }); 

    MySingleton.getInstance(context).addToRequestQueue(multipartRequest); 

呼び出しがありますただし、getParams()は呼び出されません。 getParams()が常に呼び出されるようにするにはどうすればよいですか?

答えて

0

私は同じ問題がありました。 getBodyメソッドをオーバーライドして、すべてのパラメーターをバイト配列に変換する必要があります。たとえば、JSONリクエストの場合。

@Override 
public String getBodyContentType() { 
    return "application/json; charset=utf-8"; 
} 

@Override 
public byte[] getBody() { 
    if (mParams == null) { 
     return null; 
    } 

    try { 
     return new Gson().toJson(mParams).getBytes("utf-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

これをマルチパートメッセージの本文と組み合わせる際に問題があります。パラメータを使って2つのファイルをアップロードしたいと思っています。本文には現在、すべてのマルチパートデータが含まれています。私は2バイトの配列を組み合わせるだけで動作しますか?私は現時点でそれらを組み合わせる運を持っていないよ。 –

+0

ファイルのgetByteDataを上書きしようとしましたか?次のリンクの最後の答えを見てください。http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity# –

+0

ありがとう、ありがとう。その投稿はそれを解決するのに役立ちました。 –

関連する問題