AsyncTask
約 100,000 の数字を調べて、その数字ごとにデータを取得する必要があります。1,000 個のパラメータが送信された場合は問題なく動作し、10,000 個のパラメータでも動作しますが、非常に遅くて遅延があります。RejectedExecutionException
最初に、実行するすべての数値の配列を送信していましたが、約 60,000 の数値を超えるとExeptions
.
この場合のコードは次のとおりです。
for(int i = 0; i < 70000; i++){
numbers[i] = i;
}
new NetTask().execute(numbers);
また、この場合は AsyncTask :
public class NetTask extends AsyncTask<Integer, String, String>
{
@Override
protected String doInBackground(Integer... params)
{
for (Integer number : params) {
try {
// DO NETWORK STUFF
publishProgress(number+" Successful");
} catch (Exception ex) {
publishProgress(number+" Failed");
}
}
return "";
}
}
次に、このような量のパラメーターでタスクを実行する必要がある場合、たとえばすべての値をループすることにより、単一の AsyncTask 内で処理する方がよいことをどこかで読みました。以前に使用したコードは大量の AsyncTask を作成するためです。そのため、「:」で区切られた単一の文字列で数値を送信してから、AsyncTask でそれらを単一の数値に切り戻し、それらを使用してタスクを実行しようとしましたが、以前の試行と同様の結果が得られました。
この場合の AsyncTask は次のとおりです。
public class NetTask extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... params)
{
for (String line : params) {
String[] numbers = line.split(":");
for (int i = 0; i < numbers.length; i++) {
int number = Integer.parseInt(numbers[i]);
try {
// DO NETWORK STUFF
publishProgress(number+" Successful");
} catch (Exception ex) {
publishProgress(number+" Failed");
}
}
}
return "";
}
私が求めているものを達成するためのより良い、実用的なアプローチを知っている人はいますか?