1

私のコードがダウンロードに関して大丈夫かどうか疑問に思っていました。私のアプリはデータベースからの大量のデータを必要とするため、ダウンロード時間を短縮することが重要です。ダウンロード時間は問題ありませんが、より効率的にプログラムできると思います。これを見てもらえますか?このクラスはさまざまな企業をダウンロードし、ダウンロードすると、そのカテゴリに対応する HashMap に配置されます。このクラスのダウンロードが完了すると、複数の Hashmap (カテゴリ) を含む HashMap が返され、これらの Hashmap にはダウンロードされたデータが含まれます。実際のワークフローは気にせず、このクラスがデータをダウンロードする方法に集中してください。これをより速く行う方法はありますか?

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();
           }

       }
   }
}
4

2 に答える 2

1

私はあなたがポイントを逃していると思いますAsyncTask

ですべての作業を実行し、doInBackground()を使用onPostExecuteしてUIに配信することになっています。

しかし、あなたがしているのは、でネットワーク操作を行い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オブジェクトを作成し、それらをマップに配置して、マップを自分protected void onPostExecute(Map<String,CompanyData> result)と内部に返します。実行後、この結果をUIに渡すだけです。

幸せなコーディング。

于 2013-01-09T12:05:35.457 に答える