2013-02-21 126 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;