2017-05-17 3 views
0

ich eine methos erstellen möchten, die eine Input kehre ich dies tat:Java Android AsyncHttpClient konvertieren byte [] Response INPUTSTREAM-

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

Und ich habe probleme, wenn ich zurückkehre ist [0] ist eine Null, aber wenn ich log in onSuccess:

Log.e("is" , convertStreamToString(is[0])); 

nicht null ist, warum ich null bezwecken [0]?

+0

[offensichtlich wegen Multithreading] (http://ideone.com/PPHi95) ... Post ist async – Selvin

+0

@Selvin so, wie ich eine responseBody zurückgeben kann? –

Antwort

1

Da client.post ist ein asynchroner Anruf während return is[0] ist eine synchrone. Dies bedeutet, dass is[0] null ist, solange der Async-Aufruf noch nicht erfolgt ist. Eine Möglichkeit zum Lösen besteht darin, sendGetDataRequestvoid zurückzugeben und stattdessen einen Rückruf zu akzeptieren, z.

public static void sendGetDataRequest(final YourCallback callback, ...) 

Erstellen Sie eine neue Schnittstelle namens YourCallback

public interface YourCallback{ 
    void onSuccess(String string); 
    void failure(); 
} 

und verwenden, die Rückruf innerhalb der Asynchron-Methode

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

Schließlich rufen Sie die statische Methode wie diese

sendGetDataRequest(new YourCallback(){/* Override the methods */}, ...); 

Übrigens könnte man auch AsyncTask aus dem Android-Paket verwenden, das alles oben tut. Es ist persönliche Vorliebe.

+0

@Selvin Ja es ist, aber nicht die Methode selbst, die aufgerufen wird. –

+0

Ok aber Murat was ist nun meine Rückkehr Wie sieht das aus? –

+0

@KrzysztofPokrywka Es gibt keine Rückgabe mehr. Deshalb ist es jetzt eine "void" -Methode und stattdessen haben Sie einen Rückruf. –

Verwandte Themen