我需要AsyncTask
来查看大约100,000个数字并检索每个数字的数据。当提交了1,000个参数时,它工作正常,甚至可以处理10,000个参数,但是非常慢且滞后。首先,我提交了要执行的所有数字的数组,但是注意到当我查看大约60,000个数字时,我有时会得到RejectedExecutionException
,但通常只退出我的应用程序而没有任何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中处理它,例如通过循环遍历每个值,因为我之前使用的代码创建了大量的AsyncTasks 。所以我尝试用“:”分隔单个字符串提交数字,然后在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 "";
}
有没有人知道更好的工作方法来实现我的目标?
答案 0 :(得分:1)
那么,做出如此大量任务的正确方法是什么?
首先,正如张先生指出的那样,这确实需要完成一项任务或一项任务。每个任务应该一次性“检索”关于许多“数字”的数据。例如,如果“检索数据”意味着“进行Web服务调用”,那么进行100,000次Web服务调用(消耗大约100MB的带宽)就太荒谬了。或者,如果“检索数据”意味着“对SQLite数据库运行查询”,请使用IN
运算符在一个数据库操作中“检索”有关大量“数字”的数据,而不是尝试执行100,000个单独的数据库查询
此外,假设您真正关心您选择“检索”的“数据”,AsyncTask
可能不是合适的引擎。如果无论UI层中发生什么情况都应该进行此项工作,请使用IntentService
,因为它可以独立于您的任何活动运行。
AsyncTask
执行100,000件事实际上是出于某种原因。我从未尝试将100,000个参数传递给varargs样式的方法。这可能会执行正常。如果数字是连续的,那么你只需要传递第一个和最后一个值,而AsyncTask
可以很好地计算。或者,如果您确实需要将100,000个不同的数字传递给AsyncTask
,并且如果Traceview指示将100,000个参数传递给execute()
是错误的,请创建ArrayList<Integer>
并以这种方式传递它们。