2013-02-21 124 views
2

我有一個獲取JSON數組的AsyncTask。我怎麼會返回JSON數組是這樣的:從AsyncTask返回JSON數組

JSONArray channels = new Json().execute(foo, bar);package com.example.tvrplayer; 

ECLIPS告訴我,我不能做到這一點,它應該是:

AsyncTask<Object, Integer, JSONArray> channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET"); 

JSON的異步類:

public class Json extends AsyncTask<Object, Integer, JSONArray> { 

    Json(){ 
     super(); 
    } 

    @Override 
    protected JSONArray doInBackground(Object... params) { 
     // Log.i("JSON",url); 
     String url = (String) params[0]; 
     String method = (String) params[1]; 
     InputStream is = null; 
     String result = ""; 
     JSONArray jsonObject = null; 

     // HTTP 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests! 
      if (method == "GET") { 
       HttpGet httpget = new HttpGet(url); 
       HttpResponse response = httpclient.execute(httpget); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } else if (method == "POST") { 
       HttpPost httppost = new HttpPost(url); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
      } 


     } catch(Exception e) { 
      Log.e("JSON - 1 -", e.toString()); 
      return null; 
     } 

     // Read response to string 
     try {   
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result = sb.toString();  
//   result = result.substring(1,result.length()-1); 
//   Log.d("JSON result",result); 
     } catch(Exception e) { 
      Log.e("JSON - 2 -", e.toString()); 
      return null; 
     } 

     // Convert string to object 
     try { 
      jsonObject = new JSONArray(result);    
     } catch(JSONException e) { 
      Log.e("JSON - 3 -", e.toString()); 
      return null; 
     } 
     return jsonObject; 
    } 
    @Override 
    protected void onPostExecute(JSONArray result) 
    { 
     super.onPostExecute(result); 
     final Message msg = new Message(); 
     msg.obj = result; 
    } 
} 

這是我試圖完成什麼:

JSONArray channels = new Json().execute("http://192.168.2.136:8080/rest/channel/"+ linkid +"/"+ username, "GET"); 
     try { 
      for (int i=0; i < channels.length(); i++) { 
       JSONObject channel_data = channels.getJSONObject(i); 
       String channelID = channel_data.getString("ChannelID").toLowerCase(); 
       JSONArray json = new Json().execute("http://192.168.2.136:8080/rest/program/"+ linkid +"/"+ username +"/" + channelID, "GET"); 
+0

我不能讓你......你是什麼想要... – Pragnani 2013-02-21 15:58:44

+0

asynctask,顧名思義,是異步的。這意味着它不能立即返回結果(這將是同步的,請參閱?)。你必須等到onPostExecute才能收到一些東西。 execute()不打算返回任何東西。 – njzk2 2013-02-21 15:58:58

+0

我想要返回JSON數組,以便通道= jsonObject – Harry 2013-02-21 15:59:21

回答

3

您從AsyncTask開始並不是return。你指示AsyncTask在一天之前給它做些什麼,但是不會有任何return給你。這就是爲什麼它被稱爲「異步」:你不會等待它,它不會等待你。

例如,藉此代碼與SyncTask

result = SyncTask(); 
label.setText(result); 

這意味着setText()將不被執行,直到SyncTask()完成併產生一result。它是同步的。相反,與異步,你做:

new AsyncTask() { 
    @Override 
    void onPostExecute(result) { 
     label.setText(result) 
    } 
}.start() 

這帶來了一個全新的world of trouble。我建議你看看Loaders,它的工作方式相似,但提供了更強的抽象。

此外,我告訴你這一事實意味着有很多事情你不明白。你可能想要谷歌相關的文檔,教程或文章。

+0

謝謝,我在星期一開始使用android dev,所以是的,還有ALLOT我還不明白。 – Harry 2013-02-21 16:01:52

+0

@Harry耐心然後:)這是一個**特別**毛茸茸的主題。我的意思是。較舊版本的Android(運行當今大多數手機)具有非常差的API,用於異步工作。 Android支持庫爲舊平臺提供了許多現代功能,您會在那裏找到更好的工具。 – slezica 2013-02-21 16:04:26

+0

請選擇我的更新,那是什麼林嘗試。那你建議我做什麼?我添加的這個代碼是在一個asyncTask中 – Harry 2013-02-21 16:06:16

0

從Asynctask執行(Runnable runnable)將返回void。

將您的結果onPostExecute(),像這樣:

渠道=結果; DoSomething的(渠道)

1

你不必從的AsyncTask返回任何

@Override 
protected void onPostExecute(JSONArray result) 
{ 
    super.onPostExecute(result); 
    channels = result 
    //<here you can use channels to integrate with other code> 
} 

這裏的通道將被宣佈爲類變量

JSONArray channels;