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