我在我的应用中使用自定义列表视图和图片 并从json url加载所有数据。
我创建了一个onscrollistener()
当用户滚动到列表视图的底部时,会自动在当前数据下添加数据。
但当我的数据加载整个listview冻结2-3秒。
我不知道什么是错的?
这是我的AsyncTask代码
private class BackgroundLoadMore extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Showing progress dialog before sending http request
}
protected Void doInBackground(Void... unused) {
runOnUiThread(new Runnable() {
public void run() {
LoadData();
list.setOnScrollListener(new EndlessScrollListener());
}
});
return (null);
}
protected void onPostExecute(Void unused) {
// On completing background task
// closing progress dialog etc,.
}
答案 0 :(得分:4)
您必须从主UI线程中的url获取json数据。这会阻止UI被系统更新,从而冻结。使用AsyncTask在后台执行此类网络任务。
应该在后台线程中调用 LoadData()
,这是asynctask的doInBackground()。你的调用runOnUIThread将它放回到UI线程上,而你不想要它。从asynctask中删除runOnUIThread
调用。
protected Void doInBackground(Void... unused) {
LoadData();
return (null);
}
protected void onPostExecute(Void unused) {
// On completing background task
// closing progress dialog etc,.
list.setOnScrollListener(new EndlessScrollListener());
}
答案 1 :(得分:1)
将LoadData();
移出
runOnUiThread(new Runnable() {
public void run() {}
};
答案 2 :(得分:0)
您可能正在UI线程中加载数据。
由于从互联网加载JSON数据等操作很慢(通常为0.5-10秒),如果您在应用程序的主线程内执行此操作,则此时用户界面将停止响应。您应该使用Thread或AsyncTask异步加载JSON数据,以保持UI线程自由响应用户输入(例如滚动列表)。
我的建议是使用AsyncTask加载数据。
以下是一些链接:
修改强>
将list.setOnScrollListener(new EndlessScrollListener());
和list.notifyDatasetChanged();
放在onPostExcecute();
答案 3 :(得分:0)
doInBackground正在工作线程中执行,但是在其中使用runOnUiThread启动UI therad操作。
你必须在后台线程中加载net中的所有数据,然后在postExecute中更新你的listview