2012-11-23 31 views
-3

我有一個有趣的問題給你。我在Android中有一個函數,它通過從遠程服務器加載列表視圖來與UI進行交互。正如預期的那樣,這使得我的應用程序非常緩慢。在android中創建一個函數異步/線程

隨着代碼的最低金額,我怎麼把這個功能在自己的線程或同步任務,同時仍然允許它像一個正常的功能

它沒有非常有效的執行。我只需要用盡可能少的代碼就可以做到這一點。

try 
    { //getjson file 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(url); 
    HttpResponse responseGet = client.execute(get); 
    HttpEntity resEntityGet = responseGet.getEntity(); 

     if (resEntityGet != null) { 
      InputStream instream = resEntityGet.getContent(); 
      BufferedReader str = new BufferedReader(new InputStreamReader(
        instream)); 

      String ans = new String(""); 
      build = new String(""); 
      while ((ans = str.readLine()) != null) { 
       build = build + ans; 
      } 
     //parse json file 
      JSONObject total = new JSONObject(build); 
      JSONArray prices = null; 
      if (!total.isNull("title")){ 
      Prices = title.getJSONArray("title"));} 
      ArrayList<data> newArray = new ArrayList<data>(); 

      for(int i=0;i<Prices.length();i++) 
      { 
       JSONObject price = null; 
       price = Prices.getJSONObject(i); 
       data name = new data (price.getString("StoreName"),price.getString("price"),price.getString("Link")); 
       newArray.add(name); 
      } 
      stockArr = new data[newArray.size()]; 
      stockArr = newArray.toArray(stockArr); 
        //add to listview 
      ListView listView = (ListView) findViewById(R.id.mylist); 
      listadapter adapter = new listadapter(this,R.layout.listview_item_row, stockArr); 
      listView.setAdapter(adapter); 
     } 
    } 
    catch(Exception e) 
    { 
     Toast.makeText(getApplicationContext(),e.toString(), 10).show(); 
    } 
+1

「隨着代碼的最低金額」 - 所以是不玩'代碼Golf',IMNSHO – lenik

+2

發佈您的代碼的地方。理想情況下,您應該訪問遠程服務器,獲取數據,在後臺解析數據並更新onPostExecute中的適配器。另外,如果你想要中間更新,你可以使用onProgressUpdate,當分析巨大的響應時很有用 – Atrix1987

+0

你剛說的哪些東西是可跳過的? – gaara87

回答

1

你可以把你的代碼中的AsyncTask類的doInBackground()方法從遠程服務器獲取的JSONObject的,並從該函數返回的JSONObject。它將得到onPostExecute()方法,並且可以解析並加載到列表視圖中。

private class myasyncclass extends AsyncTask<String, Void, JSONObject>{ 
    @Override 
    protected JSONObject doInBackground(String... params) { 
     //Enter code for fetching value from remote server 
     return yourjsonobj; 
    } 
    @Override 
    protected void onPostExecute(JSONObject result) { 
     //Enter code for parsing and create list view 
    } 
} 
+0

如何將上下文傳遞給onPostExecute()中的listadapter? getApplicationContext()似乎不起作用。另外,onPostExecute()會綁定UI線程嗎? – Gowtham

+1

您可以在主類(外側Asynctask類)中設置列表適配器對象。您將在onPostExecute()中獲取該對象。私人Listadapter yourAdapter; –

+0

我得到了一切工作,除了這一行。你能幫忙嗎? listView.setAdapter(適配器); – Gowtham

0

-它總是一個很好的做法,做一個UI線程的UI工作,非UI線程非UI的工作,但它通過成爲法律 Android的HoneyComb版本的到來。

-當Android應用程序在專用UI線程上啓動它時。

-在UI線程上執行像IO,網絡調用等昂貴的任務會使其不響應。

-因此,它更好地執行非UI線程上的網絡調用,可以通過兩種方式完成。 ThreadHandler或我們所說的無痛穿線和那AsyncTask

請參閱此鏈接:

http://www.vogella.com/articles/AndroidPerformance/article.html