2017-01-23 4 views
-2

Jemand könnte mir bitte erklären, warum der Wert der Variablen picture nur in der OnInBackground() vorhanden ist?Variablen Werte nicht aus DoInBackground()

Wenn ich darauf in OnPostExecute zugreifen, ist der Wert verloren.

public class GetPostAsync extends AsyncTask<Void, Integer, String> 
{ 

    String picture=""; 

    public GetPostAsync(Context context){ 
     c=context; 
    } 

    protected void onPreExecute(){ 
    } 

    protected String doInBackground(Void...arg0) { 
     try { 
      GraphRequest request = GraphRequest.newGraphPathRequest(
        AccessToken.getCurrentAccessToken(), 
        "/myquery", 
        new GraphRequest.Callback() { 
         @Override 
         public void onCompleted(GraphResponse response) { 
          try { 
           JSONObject jobj = response.getJSONObject(); 
           picture = jobj.getString("picture"); 

           Log.i("TEST","pic: "+picture); //return the right value 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
      request.executeAsync(); 
     } 
     catch(Exception e) { 
     } 
     return picture; 
    } 

    protected void onProgressUpdate(Integer...a){ 
    } 

    protected void onPostExecute(String result) { 
     Log.i("TEST","pic: "+picture); //return empty 
    } 
} 

Ich erkläre haben picture auf der Oberseite der Aktivität. Ich weiß nicht, wie halten Sie die Werte, die ich in der Onbackground()

+0

Sie müssen den Wert in 'doInBackground' nicht zurückgeben, da er bereits in einer globalen Variablen in der inneren Klasse enthalten ist. Ändern Sie einfach diese 'AsyncTask ' zu diesem 'AsyncTask ' – MohammedAlSafwan

+0

@MohammedAlSafwanle lernen einige Java-Grundlagen ... Es ist keine globale Variable, sondern Feld – Selvin

+0

Es ist Mutltithreading ... Anfrage. executeAsync(); http://ideone.com/PPHi95 – Selvin

Antwort

0

abrufen Sie rufen request.executeAsync von doInBackground. Daher wird doInBackground sofort zurückgegeben und onPostExecute kann aufgerufen werden, bevor Ihr onCompleted Rückruf aufgerufen wird.

+0

Ahhhh du hast Recht !!! Ich ändere es in executeAndWait() und gut, Danke – Lorenzo

Verwandte Themen