我很擅长使用流编码,但现在我必须这样做才能实现更高效的Http编码。
以下是我为HttpClient获取ContentProducer而编写的代码(无法正常工作):
public static ContentProducer getContentProducer(final Context context, final UUID gId)
{
return new ContentProducer()
{
public void writeTo(OutputStream outputStream) throws IOException
{
outputStream = new Base64.OutputStream(new FileOutputStream(StorageManager.getFileFromName(context, gId.toString())));
outputStream.flush();
}
};
}
我在这里使用Base64流编码器:http://iharder.sourceforge.net/current/java/base64/ 我的目标是使用此函数将我从二进制文件读取的数据提供给HttpClient作为base64编码流。
这就是我消费内容制作者的方式:
private MyHttpResponse processPOST(String url, ContentProducer requestData)
{
MyHttpResponse response = new MyHttpResponse();
try
{
HttpPost request = new HttpPost(serviceURL + url);
HttpEntity entity = new EntityTemplate(requestData);
request.setEntity(entity);
ResponseHandler<String> handler = new BasicResponseHandler();
response.Body = mHttpClient.execute(request, handler);
}
catch (HttpResponseException e)
{
}
catch (Throwable e)
{
}
return response;
}
我有另一个与GSON流媒体配合使用的ContentProducer(它正在运行):
public ContentProducer getContentProducer(final Context context)
{
return new ContentProducer()
{
public void writeTo(OutputStream outputStream) throws IOException
{
Gson myGson = MyGsonWrapper.getMyGson();
JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.beginObject();
// stuff
writer.endObject();
writer.flush();
}
};
}
我的问题是:如何使我的第一个例子工作。我做得对吗?现在我在服务器端发布空帖,所以似乎没有数据通过。
答案 0 :(得分:1)
修改强>
我认为问题在于您使用OutputStream
ContentProviders
方法传递了writeTo()
,并且您使用自己的OutputStream
覆盖了它。该类/方法的合同可能要求您将数据写入传递给您的OutputStream
。
基于查看Android Documentation,我没有看到您指定要使用的OutputStream
的方法,因此您可能需要将文件的数据写出来{ {1}}传入。
相反,你应该这样做:
OutputStream
当然,您需要为我提到的createByteBufferFromFile(...)方法提供一个实现。同样,您应该注意,您不太可能使用public void writeTo(OutputStream outputStream) throws IOException
{
byte[] buf = createByteBufferFromFile(StorageManager.getFileFromName(context, gId.toString()));
outputStream.write(buf);
outputStream.flush();
}
,因此如果这是必要的,那么您可能需要找到不同的方法。