Android ListView在加载数据时冻结

时间:2012-07-26 11:22:33

标签: java android listview

我在我的应用中使用自定义列表视图和图片 并从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,.


        }

4 个答案:

答案 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