2012-07-26 36 views
-1

我在我的应用 中使用自定义列表视图并加载json网址中的所有数据。Android ListView在载入数据时冻结

我已经创建了一个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

您必须下载在后台线程中的所有数据。 Check this:http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview – dilix 2012-07-26 11:26:45

+5

你的'runOnUiThread'调用没有任何意义。这就像走出一扇门,再次走回去。 – 2012-07-26 11:31:02

回答

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()); 

    } 
+0

我正在使用AsyncTask。用代码编辑问题。 – Badal 2012-07-26 11:28:45

+0

更新了我的回答 – Ronnie 2012-07-26 11:30:23

+0

感谢这为我工作。 – Badal 2012-07-26 11:42:30

0

您可能是在UI线程中加载数据。

由于诸如从互联网加载JSON数据的操作速度较慢(通常为0.5-10秒),因此如果您在应用的主线程中执行此操作,用户界面将停止响应。您应该使用Thread或AsyncTask来异步加载JSON数据,并让UI线程自由地响应用户输入(例如滚动列表)。

我的建议是使用AsyncTask加载数据。

这里有一些链接:


编辑

list.setOnScrollListener(new EndlessScrollListener());list.notifyDatasetChanged();onPostExcecute();

+0

我正在使用AsyncTask。用代码编辑问题。 – Badal 2012-07-26 11:29:12

+0

查看我的编辑,我添加了代码。 – 2012-07-26 11:32:49

0

doInBackground正在执行的工作线程,但它使用runOnUiThread至极启动UI therad操作。

你必须加载从净在后台线程中的所有数据,然后在postExecute更新您的ListView

1

移动LoadData();

runOnUiThread(new Runnable() { 
    public void run() {} 
};