java - 在异步任务上或异步任务中执行多个任务,并从 postexecute 返回数据

标签 java android android-asynctask

我有一个 API,用于检索各个 channel 的直播有线电视的每日时间表。我有一个场景,需要有关哪种方法在这里适用的指导。

假设我需要 API 中 10 个不同 channel 的时间表。

  • 我应该执行 10 个不同的异步任务来检索所需的数据吗?

问题: 我如何收集arraylist中的数据并在所有执行完成后返回它? 一旦 onpostexecute 返回结果,我将如何访问主函数中的数组列表?

  • 或者我应该只向我的单个异步任务提供 channel 列表,并使其为调用它的主函数构建 arraylist 的单个输出?

问题: 由于我将为此目的访问 webservice,与我的第一种方法相比,它会使其运行缓慢吗? 这种方法的第二个问题与我的第一个问题相同,我需要知道任务执行完成后何时以及如何获取完整的结果集

这里有一些代码来解释这个问题:

//going with the first approach
//invoking my asynctask from an activity or another class

//I need a global arraylist which I can use after postexecute returns its result
ArrayList<String> channels = channelManager.getAllChannelsByRegion("xyz");
        final ArrayList<ChannelSchedule> schedules = new ArrayList<ChannelSchedule>();
        final ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
        for (int i = 0; i < channels.size(); ++i){
            AsyncInvokeURLTask task = null;
            try {
                task = new AsyncInvokeURLTask(
                    channels.get(i), context, new AsyncInvokeURLTask.OnPostExecuteListener() {
                        @Override
                        public void onPostExecute(String result) {
                            // TODO Auto-generated method stub                                                          
                            try {
//Need to add results to arraylist here...But cannot know when it ends completely
                                ChannelSchedule schedule = mapper.readValue(result, ChannelSchedule.class);
                                Log.v("channel name", schedule.getChannelName());
                                Log.v("channel date", schedule.getDate());
                                Log.v("channel thumb", schedule.getListOfShows().get(0).getShowThumb());
                                Log.v("channel time", schedule.getListOfShows().get(0).getShowTime());
                            } catch (JsonParseException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (JsonMappingException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    });
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            task.execute();
        }

如果有不清楚或遗漏的内容,请告诉我。

最佳答案

启动 10 个 AsyncTask 完全没问题。

您可以统计待处理请求的数量。由于 OnPostExecute 在 UI 线程上运行,因此不存在竞争条件的风险。

private int numberOfPendingRequests;

public void MyFunc() {
  ArrayList<String> channels = channelManager.getAllChannelsByRegion("xyz");
  final ArrayList<ChannelSchedule> schedules = new ArrayList<ChannelSchedule>();
  final ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
  numberOfPendingRequests = channels.size();
  for (int i = 0; i < channels.size(); ++i) {
    schedules.add(null);
  }
  for (int i = 0; i < channels.size(); ++i) {
    AsyncInvokeURLTask task = null;
    final int index = i;  // final so it can be used in the onPostExecute.
    try {
      task = new AsyncInvokeURLTask(
        channels.get(i), context, new AsyncInvokeURLTask.OnPostExecuteListener() { 
          @Override public void onPostExecute(String result) {
            try {
              ChannelSchedule schedule = mapper.readValue(result, ChannelSchedule.class);
              Log.v("channel name", schedule.getChannelName());
              Log.v("channel date", schedule.getDate());
              Log.v("channel thumb", schedule.getListOfShows().get(0).getShowThumb());
              Log.v("channel time", schedule.getListOfShows().get(0).getShowTime());
              schedules.set(index, schedule);
              numberOfPendingRequests--;
              if (numberOfPendingRequests == 0) {
                // Everything is received, do stuff here.
              }
            } catch (JsonParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JsonMappingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
       });
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    task.execute();
  }
}

关于java - 在异步任务上或异步任务中执行多个任务,并从 postexecute 返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22097720/

相关文章:

android 输入表单上的 java.lang.ArrayIndexOutOfBoundsException

java - Java 文件中 import 语句的含义

java - Android 音频卡在底部扬声器上,无法在我的应用程序中使用耳机。应用程序也卡住

java - 如何将变量传递给 Loader 类中的 loadInBackground()?

java - 无法从服务器获取 JSON 数据

android - 在 Android 上使用 HTTPClient 进行多个 HTTP 连接的最佳方式

java - NER标签数量

java -version 结果-bash : java: command not found (in linux)

java - 如何在 Android 中存储 boolean 选择

android - Eclipse ADT : Working but "Terminate" button greyed out. ..?