gpt4 book ai didi

java - Android AsyncTask 通过http请求内存不足

转载 作者:行者123 更新时间:2023-12-02 07:08:37 25 4
gpt4 key购买 nike

所以基本上,让我设置场景:

List<Account> accounts = ...//Initialised with 2 accounts.

for( Account ac : accounts)
{
new AsyncTask<...>(){ getTwitterTimeLine(amount);}.execute();
}

所以你可以在这里看到两个 AsyncTasks 在另一个之后被直接调用。

现在这是有趣的部分,

如果我将 amount 变量设置为 10。该方法调用 HTTP 请求,请求 10 个最新的 feed 项。这工作得很好,正常的行为是返回的数据被放入多个可能的 ListView 之一(所有都可以通过 View 分页器查看,因此在这种情况下,2 个 ListView 分别由 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)

它直接指向调用 getTwitterTimeLine() 的 AsyncTask 的 doInBackground 方法。

我该如何解决这个问题?我希望能够引入大量数据,并将其泵送到多个 ListView 等。我阅读了很多资料,我想也许我需要对任务进行排队,以防其中一个任务占用大量内存,所以我研究并使用了 Proper use of AsyncTask ,但这没有效果,我仍然遇到内存不足的问题。

无论如何,如何解决/解决这个问题?我阅读了 LoaderManager,但我想将其作为最后一次调用,因为这会导致重大的设计更改。

感谢您的帮助。

注意:getTwitterTimeLine 方法调用 twitter4j 方法,该方法调用 api。

最佳答案

您不想在循环中像这样触发 AsyncTask。有一个固定的线程池大小,虽然两个帐户左右不足以将其最大化,但不这样做是一个很好的编程习惯。相反,确定如何在单个异步任务中加载所有这些数据。 doInBackground() 接受参数列表。例如,您可以使用构造函数中设置的金额创建 AsyncTask,并传入帐户以加载数据。

@Override
protected Map<Account, Data> doInBackground(Accounts...params){
Map<Account, Data> resultMap = new HashMap<Account, Data>();
for (Account account : params) {
// do whatever!
}
return resultMap;
}

关于java - Android AsyncTask 通过http请求内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com