【问题标题】:How to start multiple parallel Asynctasks or threads? (Android Java)如何启动多个并行异步任务或线程? (安卓Java)
【发布时间】:2016-12-25 00:24:10
【问题描述】:

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

但是,我收到了 android.os.TransactionTooLargeException: data parcel size 1052800 bytes,尽管所有五个提要加起来总共只有 70 个提要项。请注意,我仅使用解析的第一个提要启动下一个活动onPostExecute,但我在 AsyncTask 期间收到此异常。如何并行运行这些提要?请帮忙。

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);
        }
    }

【问题讨论】:

    标签: java android multithreading exception android-asynctask


    【解决方案1】:

    我认为这是因为您一次请求 5 个请求。 您可以对每个请求进行一些延迟,如下所示:

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

    请告诉我结果。

    【讨论】:

    • 不,这不起作用 - 您只是在提要之间添加延迟,然后查看 onPostExecute,这就是我启动下一个使用整个“提要”对象的活动的地方。
    • 这可能对你有帮助:stackoverflow.com/questions/11451393/…
    【解决方案2】:

    这不是解析造成的,应该是调用了下一个activity,其intent数据超过了1MB大小。您传递给 startNextActivity() 的提要对象应该是罪魁祸首。

    这对最终用户来说可能会慢一些,但应该有助于解决错误。不要在调用活动上调用 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() 中获取提要对象,然后执行您计划用它做的很棒的事情。

    【讨论】:

    • 您的意思是我必须在新活动上创建一个新的 AsyncLoadXMLFeed 类,还是在现有 Splash 活动上修改 AsyncLoadXMLFeed 类?我不明白这是如何解决问题的……抱歉。
    • 修改当前的,但是在启动活动之后的活动中调用。我想您传递的提要对象作为意图数据传递,这是上面代码中避免的。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多