如何启动多个并行Asynctasks或线程? (Android Java)

时间:2016-12-25 00:24:10

标签: java android multithreading exception android-asynctask

我编写了一个Asynctask,它从不同的URL加载5个feed,将所有文件写入同一个文件(通过下面显示的WriteFeed方法),然后仅根据第一个Feed加载活动。

但是,我得到android.os.TransactionTooLargeException: data parcel size 1052800 bytes,即使所有五个Feed一起只有70个Feed项。请注意,我只使用已解析的第一个Feed启动下一个活动onPostExecute,但我在AsyncTask期间遇到此异常。如何并行运行这些Feed?请帮忙。

private class AsyncLoadXMLFeed extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... params) {
            // Obtain feed
            String feedlink1, feedlink2, feedlink3, feedlink4, feedlink5;
            feedlink1=params[0];
            feedlink2=params[1];
            feedlink3=params[2];
            feedlink4=params[3];
            feedlink5=params[4];
            Log.e("MY LINK",feedlink1);
            try {
                DOMParser myParser = new DOMParser();
                feed = myParser.parseXml(feedlink1);
                feed2 = myParser.parseXml(feedlink2);
                feed3 = myParser.parseXml(feedlink3);
                feed4 = myParser.parseXml(feedlink4);
                feed5 = myParser.parseXml(feedlink5);
                if (feed != null && feed2 != null && feed3 != null && feed4 != null && feed5 != null) {
                    WriteFeed(feed);
                    WriteFeed(feed2);
                    WriteFeed(feed3);
                    WriteFeed(feed4);
                    WriteFeed(feed5);
                } else {
                    Log.e("FEED", "IS NULL");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            startNextActivity(feed);
        }
    }

2 个答案:

答案 0 :(得分:0)

我认为这是因为您一次请求5个请求。 你可以对下面的每个请求做一些延迟:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
     feed = myParser.parseXml(feedlink1);
     if(feed!=null)
      WriteFeed(feed); 
  }
}, 1000);

请让我知道结果。

答案 1 :(得分:0)

这不是由解析引起的,应该是调用下一个活动,其意图数据超过 1 MB 大小。您传递给startNextActivity()的feed对象应该是主要的罪魁祸首。

这对最终用户来说可能有点慢,但应该有助于解决错误。而不是在调用活动上调用AsyncLoadXMLFeed,而是在被调用活动的onCreate()中调用它,并修改async,如下所示。

private class AsyncLoadXMLFeed extends AsyncTask<String, Void, Void> {
FeedListener fl;
interface FeedListener{
   void onFeedParsed(Feed feed); //use appropriate class name
}
AsyncLoadXMLFeed(FeedListener fl){
   this.fl=fl;
}
@Override
protected Void doInBackground(String... params) {
   //No changes here
}
@Override
protected void onPostExecute(Void result) {
   super.onPostExecute(result);
   fl.onFeedParsed(feed); //the same feed object which was passed in startNewActivity.
}

在你称之为异步的活动上,你将获得onFeedParsed()中的feed对象,然后执行你计划用它做的很棒的东西。