2013-01-09 19 views
1

我只是想知道我的代碼在下載方面是否正常。我的應用程序需要來自數據庫的大量數據,因此快速下載時間至關重要。下載時間不錯,但我認爲它可以編程更有效率。你能看看這個嗎?這個類下載了許多不同的公司,下載後它們被放入與其類別相對應的HashMap中。當完成下載這個類時,返回一個包含多個Hashmaps(類別)的HashMap,並在這些Hashmaps中下載下載的數據。不要介意實際的工作流程,但請專注於本課程下載數據的方式。有沒有辦法做得更快?從MySQL下載Android應用程序中數據的有效方式

public class CompanyDAO { 

    private static Controller delegate; 
    private static String companyUrl = "http:// URL HERE"; 

    private Map<Object, Object> companyMap = new HashMap<Object, Object>(); 
    private Map<String, Integer> pinMap = new HashMap<String, Integer>(); 


    public CompanyDAO (Controller _delegate, Map<String, Integer> map) { 
     delegate = _delegate; //reference to controller 
     pinMap = map; 

    } 

    public void getCompanyData(ArrayList<Object> categoriesArray) { 
     for (int i = 0; i < categoriesArray.size(); i++) { 
      Map<String, Object> categoriesInMap = new HashMap<String, Object>(); 
      //ArrayList<Object> categoriesInMapArray = new ArrayList<Object>(); 
      companyMap.put(categoriesArray.get(i), categoriesInMap); 
     } 
     this.downloadCompanyData(); 
    } 

    private void downloadCompanyData() { 

     companyUrl = companyUrl + delegate.ID; 
     try { 
      new DownloadCompanyData().execute(companyUrl).get(10000, TimeUnit.MILLISECONDS); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TimeoutException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private class DownloadCompanyData extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void onPostExecute(String result) { 



      JSONArray companyDataArray; 

      try { 
       companyDataArray = new JSONArray(result); 

       for(int i=0;i<companyDataArray.length();i++){ 
        JSONObject id = companyDataArray.getJSONObject(i); 
        String catName = id.getString(Controller.CAT_NAME); 

        if (companyMap.get(catName) != null) { 
         Markers marker = new Markers(new LatLng(id.getDouble("latitude"), id.getDouble("longitude")), id.getString(Controller.CAT_NAME), id.getString(Controller.ID), id.getString(Controller.SUBSCRIPTION), pinMap.get(catName), id.getString(Controller.TITLE), id.getString(Controller.COMPANY_NAME), id.getString(Controller.WWW), id.getString(Controller.STREET), id.getString(Controller.HOUSE_NUMBER), id.getString(Controller.HOUSE_ADD)); 

         ((Map<String,Object>) companyMap.get(catName)).put(id.getString(Controller.TITLE), marker.markerInformationMap); 

        } 

       } 
       delegate.setCompanyHashMap(companyMap); 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 
} 
+0

你爲什麼要使用HTTP連接到遠程數據庫?這是多餘的開銷。 – m0skit0

+0

什麼是一個好的選擇呢? –

+0

爲什麼不直接連接到MySQL服務器? – m0skit0

回答

1

我想你錯過的AsyncTask

點它應該做doInBackground()所有的工作,然後使用onPostExecute把它輸送到用戶界面。

但是你在做什麼是在doInBackground上做網絡操作和在onPostExecute上做數據解析。

此外,JSON對象是需要進一步解析的原始數據。你應該在後臺做所有的解析。例如,假設您的companyData是地址,電話號碼,大小和名稱。你可以有這樣一個類(PS我在寫這一切,沒有測試,會出現一個小錯誤在這裏出現,但你的想法):

public class CompanyData{ 
    private String name, address, phone; 
    private int size; 
    public CompanyData(JsonObject jo){ 
     name = jo.getString("name"); 
     address = jo.getString("address"); 
     phone = jo.getString("phone"); 
     size = jo.getInt("size"); 
    } 
    // put a bunch of get methods here... 
    // getName(), getAddress(), etc. 
} 

然後在你的「保護地圖doInBackground(String ... urls)'完成網絡操作,創建JsonArray,創建一個Map<String,CompanyData>,循環創建CompanyData對象的數組,並將它們放置到Map中並將地圖返回到您的protected void onPostExecute(Map<String,CompanyData> result),並在後面執行它只是將此結果傳遞給用戶界面。

快樂編碼。

+0

感謝您的評論!我現在要看看這個,並讓你知道,如果一切正常! :-) –

+0

一切工作正常。雖然我沒有直接看到速度差異,但我明白了在後臺完成所有這些工作的重要意義。 所以我像你所建議的那樣在doInBackground中實現了json解析。 但下載進度很好嗎?該應用程序工作得很好,但我只是認爲在下載和解析階段有所改進。 –

+1

取決於您定位的平臺,您可以更改爲「HttpURLConnection」而不是「HttpClient」,因爲我聽說它效率更高,但您必須向Google瞭解詳細信息。整個'stream-> String-> Json'部分就是這樣做的方式,我從來沒有見過更好的方法。我建議的主要想法是完全卸載用戶界面,因此即使需要相同時間,這段時間也會在後臺線程中執行,並且您的用戶界面將保持快速平穩運行。 – Budius

0

我總是做這樣的事情..

... 
private ProgressDialog pDialog; 
ArrayList<HashMap<String, String>> CompanyList; 
JSONParser jParser = new JSONParser(); 
JSONArray Company = null; 
static String url_all_company = "http://your_site/files.php"; 
.... 

private class CompanyData extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Load data.."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     CompanyList = new ArrayList<HashMap<String, String>>(); 

     // Building Parameters if any.. to fetching all data, don't declare any param 
     List<NameValuePair> param = new ArrayList<NameValuePair>(); 
     param.add(new BasicNameValuePair("uid", uid)); 

     // getting JSON string from URL 
     JSONObject json = jParser.makeHttpRequest(url_all_company, "POST", param); 

     // Check your log cat for JSON reponse 
     Log.d("All Company: ", json.toString()); 

     try { 
      // Checking for SUCCESS TAG 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // Company found 
       // Getting Array of Company 
       Company = json.getJSONArray(TAG_COMPANIES); 

       // looping through All Company 
       for (int i = 0; i < Company.length(); i++) { 
        JSONObject json = Company.getJSONObject(i); 

        // Storing each json item in variable 
        String id = json.getString(TAG_GID); 
        String name = json.getString(TAG_NAME); 
        String jml = json.getString(TAG_EMPLOYEE); 
        String deskripsi = json.getString(TAG_DESKRIPSI); 
        String logo = json.getString(TAG_LOGO); 

        // creating new HashMap 
        HashMap<String, String> map = new HashMap<String, String>(); 

        // adding each child node to HashMap key => value 
        map.put(TAG_GID, id); 
        map.put(TAG_NAME, name); 
        map.put(TAG_EMPLOYEE, jml); 
        map.put(TAG_DESKRIPSI, deskripsi); 
        map.put(TAG_LOGO, logo); 

        // adding HashList to ArrayList 
        CompanyList.add(map); 

       } 
      } else { 
       // no CompanyList found 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null;  

    } 

    @Override 
    protected void onPostExecute(Void args) { 
     list=(ListView)findViewById(R.id.list); 

     // Getting adapter by passing data ArrayList 
     adapter=new LazyAdapter(MainActivity.this, CompanyList);   
     list.setAdapter(adapter); 

     pDialog.dismiss(); 

    } 

} 
相關問題