2011-11-20 48 views
0

我有以下连接到数据库并返回一个json数组的方法。如何获得json字符串的值,然后通过此函数解析它

private String getServerData(String returnString) { 

     InputStream is = null; 

     String result = ""; 
     //the year data to send 
     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("year","1970")); 

     //http post 
     try{ 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(KEY_121); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

     }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 

     //convert response to string 
     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(); 
       result=sb.toString(); 
     }catch(Exception e){ 
       Log.e("log_tag", "Error converting result "+e.toString()); 
     } 

     try{ 
       JSONArray jArray = new JSONArray(result); 
       for(int i=0;i<jArray.length();i++){ 
        // JSONObject json_data = jArray.getJSONObject(i); 
        JSONObject json_data = jArray.getJSONObject(i); 
        Log.i("log_tag","id: "+json_data.getInt("id")+ 
          ", name: "+json_data.getString("name")+ 
          ", sex: "+json_data.getInt("sex")+ 
          ", birthyear: "+json_data.getInt("birthyear") 
        ); 


         //Get an output to the screen 
         returnString += "\n\t" + jArray.getJSONObject(i); 
       } 
     }catch(JSONException e){ 
       Log.e("log_tag", "Error parsing data "+e.toString()); 

       returnString += result.toString(); 
     } 
     return returnString; 
    } 

然后我想打电话从外面却是非常新到Java这个方法我不知道如何获取刺中把它放在HM的物体,像那个那注释掉。见下面

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ListView listView = (ListView)findViewById(R.id.list); 
     myBooks = new ArrayList<HashMap<String,Object>>(); 
     HashMap<String, Object> hm; 
     hm = new HashMap<String, Object>(); 
     List<String> list=new ArrayList<String>(); 
     list.add(getServerData(KEY_121)); 





     //With the help of HashMap add Key, Values of Book, like name,price and icon path 
     /* hm = new HashMap<String, Object>(); 
     hm.put(BOOKKEY, "Android"); 
     hm.put(PRICEKEY, "Price Rs: 500"); 
     hm.put(IMGKEY, R.raw.android); //i have images in res/raw folder 

     myBooks.add(hm); 


SimpleAdapter adapter = new SimpleAdapter(this, myBooks, R.layout.listbox, 
       new String[]{BOOKKEY,PRICEKEY,IMGKEY}, new int[]{R.id.text1, R.id.text2, R.id.img}); 

     listView.setAdapter(adapter); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    } 

我这里对象的代码来获取返回的字符串,并使用HM对象将其添加到myBooks对象就像它在注释掉的代码怎么做。

感谢

回答

1

由于getServerData()将会需要一段时间来执行(它包含一个HTTP请求),你不能直接从UI线程中运行它。 (onCreate()直接在UI线程上,并且永远不应该暂停UI线程)。

这意味着你必须创建一个AsyncTask并从AsyncTaskdoInBackground()调用getServerData()。您可以在AsyncTaskonPostExecute()中返回显示JSON结果。

这意味着您想通过要将结果显示在AsyncTask的位置的SoftReference。你想让它成为SoftReference以防万一你在获取JSON的时候发生了什么(就像你离开Activity一样)。

我建议你阅读this Android blog articlethe code from the article创建自己的项目。一旦启动并运行后,将该图像下载器修改为JSON下载程序。这篇文章应该对你非常有用,因为它还使用适配器在列表视图中显示项目。

您的示例与本文中的示例有几种不同之处,但我认为它实际上更简单,所以如果您将头部缠绕在文章中的代码中,那么您将能够使代码正常工作之后。

参考文献:
AsyncTask
SoftReferences
Multithreading for Performance
Working Code from the Article Above which implements something like you want but w images

+0

彼得嗨,虽然很好的建议,我并不是正在寻找那个。不过,我认为我几乎接近解决这个问题,如果它有效,我会在这里发布。感谢有价值的链接 – Autolycus

0

这里是我做过什么和它工作得很好

1-不是返回字符串,而是将结果返回给调用。

2然后在那之后我建立了一个字符串,然后我就能够分析它就好了这样

returnedResult = this.getServerData(KEY_121); 
     try { 
     JSONArray jArray = new JSONArray(returnedResult); 
     for(int i=0;i<jArray.length();i++){ 
      // JSONObject json_data = jArray.getJSONObject(i); 
      JSONObject json_data = jArray.getJSONObject(i); 

      hm = new HashMap<String, Object>(); 
      hm.put(IDKEY, json_data.getInt("id")); 
      hm.put(NAMEKEY, json_data.getString("name")); 
      hm.put(IMGKEY, R.raw.android); 
      myBooks.add(hm); 

     } 

希望帮助到这里有人 感谢