我编写了一个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);
}
}
答案 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对象,然后执行你计划用它做的很棒的东西。