Java Android AsyncHttpClient将字节[]响应库转换为InputStream

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

我想创建一个返回InputStream的Methodos,我这样做了:

 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 */}, ...);