2013-09-25 56 views
1


我用JSONparser來獲得遠程MySQL數據庫的一些值,這是工作的罰款,直到我在Android 3.0以上版本(蜂窩)進行了測試,有的監護人這將不允許進程在其主線程上執行聯網操作。的AsyncTask + JSON(如何得到一些值)

所以我發現我需要一個的AsyncTaskHow to fix android.os.NetworkOnMainThreadException?


並試用了此主題:

Get returned JSON from AsyncTask

Return JSON Array from AsyncTask

How to return data from asynctask


好了,現在我知道的AsyncTask不能返回值,但我需要的,因爲我有很多來電不同的活動等待,要處理和/或顯示在屏幕上的信息來獲得此JSON值(這就是爲什麼我不能在OnPostExecute中實現,我猜)。


下面是這些類,以及我的舊JsonParser的一些改編。

JSONParser.java

public class JSONParser extends AsyncTask<List<NameValuePair>, Void, JSONObject> { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static JSONObject result = null; 
    static String json = ""; 

    private static String jsonURL = "http://192.168.1.119/Server/db/json/"; 

    private ProgressDialog progressDialog; 

    // constructor 
    public JSONParser() { 

    } 

    @Override 
    protected void onPreExecute() { 
     //progressDialog = new ProgressDialog(); 
     progressDialog.setMessage("Aguarde..."); 
     progressDialog.show(); 
    } 

    protected JSONObject doInBackground(List<NameValuePair>... params) { 

     // Making HTTP request 
     try { 

      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(jsonURL); 
      httpPost.setEntity(new UrlEncodedFormEntity(params[0])); 

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

    } 


    protected void onPostExecute(JSONObject jObj) { 

     result = jObj; 
     progressDialog.dismiss(); 

    } 

    public JSONObject getJson(List<NameValuePair> params){ 

     this.execute(params); 

     return result; 

    } 

} 


UserFunctions.java(有的叫例子)

(...) 

public UserFunctions(){ 
    JSONParser jsonParser = new JSONParser(); 
} 

public JSONObject loginUser(String email, String password){ 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("tag", login_tag)); 
    params.add(new BasicNameValuePair("email", email)); 
    params.add(new BasicNameValuePair("password", password)); 

    JSONObject json = jsonParser.getJson(params); 
    //JSONObject json = jsonParser.execute(params); //doesn't return 
    return json; 
} 
public JSONObject listProjects(String email){ 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("tag", list_projects)); 
    params.add(new BasicNameValuePair("email", email)); 

    JSONObject json = jsonParser.getJson(params); 
    return json; 
} 

public JSONObject setDisp(String dispID, String disp, String comment){ 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("tag", set_disp)); 
    params.add(new BasicNameValuePair("dispID", dispID)); 
    params.add(new BasicNameValuePair("disp", disp)); 
    params.add(new BasicNameValuePair("comment", comment)); 

    JSONObject json = jsonParser.getJson(params); 
    return json; 
} 

(...) 



我試圖讓值傳遞給一個變種(JSONObject的結果),但沒有效果。 (NullPointerException,我想它嘗試在異步結束之前訪問var,因爲它是「異步」)

我需要做什麼來獲取值?有任何想法嗎?


非常感謝的傢伙!

+1

你可以發佈stacktrace嗎? – Raghunandan

+0

[看到這個答案](http://stackoverflow.com/questions/18517400/inner-class-can-access-but-not-update-values-asynctask/18517648#18517648)與AsyncTask一起使用'interface' '。然後,您可以在任務完成時得到回調。 – codeMagic

+0

你也可以使用arraylist。這很容易存儲和檢索值。 – Ranjit

回答

1

習慣使用AsyncTask,你會需要它很多。

如果您需要在任務完成時觸發某些東西,廣播。每個感興趣的人(包括其他活動)都需要註冊一個廣播接收器。

AsyncTask

new AsyncTask<Void,Void,List<Result>>() { 
    @Override 
    public List<Result> doInBackground(Void... voids) { 
    final List<Result> results = ...; // get from network, or whatever 
    } 

    @Override 
    public void onPostExecute(List<Result> results) { 
    Intent intent = new Intent("com.my.action.RESULTS_READY"); // or whatever 
    intent.putExtra("com.my.extra.RESULTS", new ArrayList<Result>(results); 
    sendBroadcast(intent); 
    } 
}.execute(); 

現在,在你的其他的活動,報名參加本/註銷在onCreate()onDestroy()。我假設你想在暫停時接收廣播並更新一些實例數據。

請注意,還有其他選項。例如,您可以將結果寫入數據庫,然後僅播出結果已準備就緒,並希望每個感興趣的方在需要時從數據庫檢索它們。這可能會更好,因爲它不依賴於接收廣播來獲得有效數據(這也是一個更長的例子,所以我會給你留下這個樂趣)。

+0

謝謝!對不起,最近的回覆,我正在嘗試做你所說的「有趣的部分」,哈哈。 intent.putExtra絕對是傳遞值的方式,即使使用AsyncTask也是如此。 再次感謝。 – Aly