2016-11-07 4 views
0

ユーザーデータを取得するためにサーバー上で(すべての)必要な呼び出しを行っています。これはデータをポストするための共通クラスを作成し、レスポンスをJSONオブジェクトとして取得します。しかし、これによって私たちのアプリケーションは遅すぎるので、私たちは非同期タスクを介してデータを取得できると考えています。非同期タスクの後にJSONデータを返す

だから我々は、以下のように我々のコードをmodifed: -

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

しかし、我々は、このエラーが発生しました

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) 

バックグラウンドプロセスを終了する前に、制御を行っています。 これを解決する方法を教えてください。

+0

のようなネットワーク呼び出しを行うためのネットワークライブラリを使用して検討すべき? –

+0

申し訳ありませんが、質問が更新されました。 BTWこれは、エラーLog.d( "応答:"、json.toString())を取得する行です。 –

+0

ここでは新しいオブジェクトを作成していますか?JSONObject json = j1.getjObjResult(); ..新しいオブジェクトを作成する必要はありませんが、onPostExc –

答えて

1

さてあなたは

jsonParser1.execute(); 

を呼び出しているとき、非同期タスクは別のスレッドで行われます。これらの行

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

を意味しているJSONParserのdoInBackground取得の実行(並列でも、実際に彼らは両方の実行)前に実行します。お電話の際j1.getjObjResult();

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

でコードもまだ実行されていないことを意味

。これを解決する簡単な方法は、次のようなインターフェースを持つことです。あなたはAsyncTaskはとても

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

のようなあなたのコールバックの参照を渡す実行し、コールバックの参照を維持すると

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

そしてあなたのUserFunctionクラスリンク

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

でこれを実装しますあなたのAsyncTaskのように

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 


} 

あなたのAsyncTaskのonPostExecuteでこれを行います。

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

そして、あなたは本当にライン45はUserFunctions.javaであるretrofitまたはvolley