AsyncTask和大量的执行

时间:2012-12-21 23:31:47

标签: android android-asynctask

我需要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 "";
        }

有没有人知道更好的工作方法来实现我的目标?

1 个答案:

答案 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>并以这种方式传递它们。