2016-11-07 3 views
0

Wir tun eine Menge (alle notwendigen) Anruf auf Server Benutzerdaten zu erhalten, denn das wir eine gemeinsame Klasse erstellten Daten zu veröffentlichen, und Antwort als JSON-Objekt retrive. Aber dadurch wird unsere Anwendung zu langsam, also denken wir, können wir Daten über asynchrone Aufgabe abrufen.Return JSON-Daten nach async Aufgabe android

So modifed wir unseren Code wie folgt: -

UserFunction.java

public JSONObject getUserData(String userName,String pNumber){ 
    // Building Parameters 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("tag", getUser)); 
    params.add(new BasicNameValuePair("search_number_array", userName)); 
    params.add(new BasicNameValuePair("pNumber", pNumber)); 
    params.add(new BasicNameValuePair("id", pNumber)); 
    // getting JSON Object 
    JSONParser jsonParser1=new JSONParser(loginURL, params); 
    // jsonParser1.getJSONFromUrl(loginURL, params); 
    jsonParser1.execute(); 
    Jsonresult j1=new Jsonresult(); 
    JSONObject json =j1.getjObjResult(); 
      Log.d("Response:", json.toString()); //line 45, on which getting error 
    return json; 
} 

JSONParse.java

public class JSONParser extends AsyncTask<String, String, JSONObject> { 

static InputStream is = null; 
static JSONObject jObj = null; 
Jsonresult obj; 
static String json = ""; 
List<NameValuePair> postparams= new ArrayList<NameValuePair>(); 
String URL=null; 
// constructor 
public JSONParser(String url, List<NameValuePair> params) { 
    URL=url; 
    postparams=params; 
    Log.e("entered constructor", "entered in constructor "); 

    // Making HTTP request 


} 

@Override 
protected JSONObject doInBackground(String... strings) { 
    Log.e("entered in bg", "entered in doinbackground "); 

    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(URL); 
     httpPost.setEntity(new UrlEncodedFormEntity(postparams)); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent(); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
     Log.e("JSON", json); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 
} 

public void getJSONFromUrl(String url, List<NameValuePair> params) { 
    URL=url; 
    postparams=params; 
    Log.e("entered ", "entered in getjsonurl "); 

    // Making HTTP request 


} 
@Override 
protected void onPostExecute(JSONObject result) { 
    this.obj.setjObjResult(result); 
} 
@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
} 
} 

Jsonresult.java

public class Jsonresult { 
JSONObject jObjResult = null; 

public JSONObject getjObjResult() { 
    return jObjResult; 
} 

public void setjObjResult(JSONObject jObjResult) { 
    this.jObjResult = jObjResult; 
} 
} 

Aber wir sind bekomme diesen Fehler

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference 
     at com.keepAeye.gps.UserFunctions.getUserData(UserFunctions.java:45) 

Mittel Kontrolle geht vor Abschluss Hintergrundprozess. Bitte sagen Sie uns, wie wir das beheben können?

+0

wo ist die Linie 45 in UserFunctions.java wirklich in Betracht ziehen? –

+0

Sorry, Frage aktualisiert. BTW das ist die Linie, auf der immer Fehler Log.d ("Antwort:" json.toString()); –

+0

das Problem ist, dass Sie neues Objekt hier schaffen JSONObject json = j1.getjObjResult(); ..You muß nicht neues Objekt erstellen, sondern die alten benutzen, die in Aysnc in onPostExc –

Antwort

1

Nun, wenn Sie

jsonParser1.execute(); 

Die Asynchron-Aufgabe sind Aufruf geschieht in einem anderen Thread. Was bedeutet, dass diese Linien

Jsonresult j1=new Jsonresult(); 
JSONObject json =j1.getjObjResult(); 
Log.d("Response:", json.toString()); 
return json; 

vor JSONParser des doInBackground des bekommen ausgeführt ausgeführt werden sollen (gut sie tatsächlich beide laufen parallel).

Was bedeutet, dass, wenn Sie j1.getjObjResult(); Code rufen in

@Override 
protected void onPostExecute(JSONObject result) { 
    this.obj.setjObjResult(result); 
} 

noch nicht einmal ausgeführt wird. Ein einfacher Weg, um dies zu lösen, ist eine Schnittstelle wie.

public interface CallBack { 
    void onSuccess(JSONObject json); 
} 

Und dann implementieren diese in Ihrer Userfunction Klasse Link

class UserFunction implements CallBack { 
    ... 
    @Override 
    public void onSuccess(JSONObject json) { 
    Log.d("Response:", json.toString()); 
    } 
} 

Wenn Sie Ihre AsyncTask eine Referenz Ihrer Callback wie so

JSONParser jsonParser1=new JSONParser(loginURL, params, this); 

und pflegen einen Verweis von dem Rückruf passieren ausführen in Ihrem AsyncTask wie

CallBack mCallback; 

public JSONParser(String url, List<NameValuePair> params, CallBack callBack) { 
    URL=url; 
    postparams=params; 
    mCallback = callBack;   
    Log.e("entered constructor", "entered in constructor "); 

    // Making HTTP request 


} 

In Ihrem OnPostExecute Ihres AsyncTask tun.

@Override 
protected void onPostExecute(JSONObject result) { 
    mCallback.onSuccess(result); 
} 

Und Sie sollten für die Herstellung von Netzwerk-Anrufen einer Netzwerk-Bibliothek wie retrofit oder volley