性能改进 - 并行执行GET语句

时间:2018-01-14 07:07:25

标签: java android performance android-asynctask android-async-http

在我的Android应用程序中,我正在执行该URL多次。当arraylist" prefCoinList"中的项目数量较少时,程序会快速加载。当列表中的项目数量更多时,实际上需要花费很多时间。这会在加载App时造成严重延迟。

我需要使用任何并行过程快速完成此操作。能否请您建议任何有效的流程?

public class initialFetchAltCoins extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
    }

    protected String doInBackground(String... params) {
        try {
            loadAltCoins(getAltCoinData());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(String params) {
        maingame.dataReady=true;
        //-- Testing 1111 starts----
        System.out.println("Testing 1111 loading Initial + (Prefered + Tran Coins)  : " +  df.format(new Date()));
        //-- Testing 1111 Ends----
    }
    protected void onProgressUpdate(String... progress) {
        // setting progress percentage
    }
}




public String getAltCoinData() throws IOException {
    List<String> setting = getSetting();

    BufferedReader br = new BufferedReader(new InputStreamReader(getDataFromURL("https://api.coinmarketcap.com/v1/ticker/?convert="+setting.get(0)+"&limit="+setting.get(1))));
    StringBuilder sb = new StringBuilder();
    String line;

    while ((line = br.readLine()) != null) {
        if(!line.toString().equals("]")){
            sb.append(line);
        }
        sb.append("\n");
    }
    //-- Testing 1111 starts----
    System.out.println("Testing 1111 Initial 30 coins Loading Time              : " +  df.format(new Date()));
    //-- Testing 1111 Ends----

    List<String> prefCoinList = getPrefCoin();
    if(prefCoinList.size()>0){
        sb.append(",");
        for(int i=0;i<prefCoinList.size();i++){
            System.out.println("prefCoinList.get(i) : " + prefCoinList.get(i));
            System.out.println("setting.get(0)      : " + setting.get(0));
            br = new BufferedReader(new InputStreamReader(getDataFromURL("https://api.coinmarketcap.com/v1/ticker/"+prefCoinList.get(i)+"/?convert="+setting.get(0))));

            while ((line = br.readLine()) != null) {
                if(!(line.toString().equals("[") )) {
                    if(!line.toString().equals("]")){
                        sb.append(line);
                    } else{
                        if(i!=(prefCoinList.size()-1)){
                            sb.append(",");
                        }
                    }
                }
                sb.append("\n");
            }

            if(i==(prefCoinList.size()-1)){
                sb.append("]");
            }


        }
    }else{
        sb.append("]");
    }

    //-- Testing 1111 starts----
    System.out.println("Testing 1111 loading (Prefered + Tran Coins)            : " +  df.format(new Date()));
    //-- Testing 1111 Ends----

    br.close();

    return sb.toString();
}

1 个答案:

答案 0 :(得分:0)

您可以使用ExecutorService来汇集和执行大量请求,甚至可以启动多个异步任务,每个要获取的URL一个。这意味着,不是只有一个initialFetchAltCoins类能够安全地读取所有网址,而是为每个网址启用AsyncTask。 如果您遵循此方法,请确保您有一种方法可以控制一次发送多少个线程。你不想一次完成100个任务。