0

我需要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 中处理它,例如通过循环每个值,因为我之前使用的代码创建了大量的 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 "";
        }

有没有人知道任何更好和更有效的方法来实现我所追求的目标?

4

1 回答 1

1

那么完成如此大量任务的正确方法是什么?

首先,正如常先生所指出的,这确实需要一项或几项任务。每个任务都应该一次“检索”有关大量“数字”的数据。例如,如果“检索数据”的意思是“进行 Web 服务调用”,那么进行 100,000 次 Web 服务调用,可能会消耗 100MB 的带宽,这是非常荒谬的。或者,如果“检索数据”的意思是“对 SQLite 数据库运行查询”,则使用IN运算符在一次数据库操作中“检索有关大量“数字”的数据,而不是尝试执行 100,000 个单独的数据库查询。

此外,假设您确实关心您选择“检索”的这些“数据”,则AsyncTask可能不是合适的引擎。如果无论 UI 层发生什么都应该进行这项工作,请改用 an IntentService,因为它可以独立于您的任何活动运行。

不过,让我们假设,AsyncTask出于某种原因,做 100,000 件事情实际上是合适的。我从未尝试将 100,000 个参数传递给可变参数样式的方法。这可能运行良好。如果数字是连续的,您只需要传递第一个和最后一个值,并且AsyncTask可以很好地计数。或者,如果您确实需要将 100,000 个不同的数字传递给AsyncTask,并且如果 Traceview 指示将 100,000 个参数传递给execute()是不好的,那么创建一个ArrayList<Integer>并以这种方式传递它们。

于 2012-12-22T00:13:29.843 回答