所以基本上,让我设置场景:
List<Account> accounts = ...//Initialised with 2 accounts.
for( Account ac : accounts)
{
new AsyncTask<...>(){ getTwitterTimeLine(amount);}.execute();
}
所以你可以在这里看到两个 AsyncTask 被一个接一个地调用。
现在这是有趣的部分,
如果我将数量变量设置为 10。该方法调用一个 HTTP 请求,请求 10 个最新的提要项。这工作得很好,正常的行为是将返回的数据放入多个可能的列表视图之一中,(所有都可以通过 viewpager 查看,因此在这种情况下,2 个列表视图分别由 2 个异步任务填充)
但
如果我把数量设置为 100,那么基本上更多的 JSON 数据,我得到以下内容;
04-04 03:11:20.175: E/AndroidRuntime(4574): FATAL EXCEPTION: AsyncTask #1
04-04 03:11:20.175: E/AndroidRuntime(4574): at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-04 03:11:20.175: E/AndroidRuntime(4574): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.lang.Thread.run(Thread.java:856)
04-04 03:11:20.175: E/AndroidRuntime(4574): Caused by: java.lang.OutOfMemoryError
04-04 03:11:20.175: E/AndroidRuntime(4574): at
java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
04-04 03:11:20.175: E/AndroidRuntime(4574): at java.lang.StringBuilder.append(StringBuilder.java:216)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.internal.org.json.JSONArray.join(JSONArray.java:363)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.internal.org.json.JSONArray.toString(JSONArray.java:605)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.internal.http.HttpResponse.asJSONArray(HttpResponse.java:192)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.internal.json.StatusJSONImpl.createStatusList(StatusJSONImpl.java:381)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.internal.json.z_T4JInternalJSONImplFactory.createStatusList(z_T4JInternalJSONImplFactory.java:74)
04-04 03:11:20.175: E/AndroidRuntime(4574): at twitter4j.TwitterImpl.getHomeTimeline(TwitterImpl.java:127)
它直接指向我的 AsyncTask 的 doInBackground 方法,在该方法中调用 getTwitterTimeLine()。
我该如何解决这个问题?我希望能够引入大量数据,并将其泵送到多个列表视图等。我阅读了很多,我想也许我需要将任务排队,以防其中一个占用大量内存,所以我研究并使用正确使用 AsyncTask,但这没有效果,我仍然遇到内存不足的问题。
无论如何如何解决/解决这个问题?我阅读了 LoaderManager,但我想将其推迟到最后一次调用,因为它会导致重大的设计更改。
感谢您的任何帮助。
注意:getTwitterTimeLine 方法调用调用 api 的 twitter4j 方法。