Java Android AsyncHttpClient将字节[]响应库转换为InputStream
我想创建一个返回InputStream的Methodos,我这样做了:Java Android AsyncHttpClient将字节[]响应库转换为InputStream,java,android,Java,Android,我想创建一个返回InputStream的Methodos,我这样做了: public static InputStream sendGetDataRequest(Context context, String version, String power, String lon, String lat, String radius) throws MalformedURLException, Co
public static InputStream sendGetDataRequest(Context context,
String version, String power, String lon, String lat, String radius) throws MalformedURLException, ConnectTimeoutException, IOException
{
AsyncHttpClient client = new AsyncHttpClient();
String url = Util.getServerUrl(context) + "/GetData";
// ContentValues values=new ContentValues();
RequestParams values = new RequestParams();
values.put("token", String.valueOf(E_Gps.TOKEN));
values.put("xml", login_xml);
StringEntity entity = null;
try {
entity = new StringEntity(values.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
entity.setContentType(new BasicHeader("Content-Type","application/xml"));
final InputStream[] is = new InputStream[1];
final InputStream inputStream;
client.post(context,url,values , new AsyncHttpResponseHandler(Looper.getMainLooper()) {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Log.e("success_noti", new String(responseBody) + "");
is[0] = new ByteArrayInputStream(responseBody);
Log.e("Status " , statusCode + " ");
Log.e("is" , convertStreamToString(is[0]));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e("success_noti", new String(responseBody) + "");
Log.e("Status " , statusCode + " ");
}
});
return is[0];
}
当我返回时出现问题[0]为空,但当我成功登录时:
Log.e("is" , convertStreamToString(is[0]));
不为null为什么我有null对象是[0]?因为client.post是一个异步调用,而return是[0]是一个同步调用。这意味着只要异步调用尚未完成,is[0]就为null。一种解决方法是使sendGetDataRequest返回为void,并接受回调,例如
public static void sendGetDataRequest(final YourCallback callback, ...)
创建一个名为YourCallback的新接口
并在异步方法中使用该回调
client.post(context,url,values , new AsyncHttpResponseHandler(Looper.getMainLooper()) {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
callback.onSuccess(convertStreamToString(is[0]));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
callback.onFailure();
}
}
最后,您可以这样调用静态方法
sendGetDataRequest(new YourCallback(){/* Override the methods */}, ...);
顺便说一下,您还可以使用android软件包中的AsyncTask,它可以完成上述所有工作。这是个人喜好。。。。邮政是async@Selvin那么我怎样才能返回一个responseBook呢?@Selvin是的,但不是被调用的方法本身。好的,但是Murat现在我的返回是什么样子的?@KrzysztofPokrywka,再也没有返回了。这就是为什么它现在是一个void方法,而你有一个回调。Murat K。好的,我看不出你把这个方法改成了void@KrzysztofPokrywka我忘了。我现在做到了:
sendGetDataRequest(new YourCallback(){/* Override the methods */}, ...);