创建异步任务以检索对象,然后将其传递给BaseAdapter

时间:2013-07-27 09:14:52

标签: android listview memory-leaks android-asynctask

我从互联网上检索对象但是当直接将它传递给BaseAdapter时,滚动ListView非常慢且不顺畅。 在下面我提出了这个问题:

List view crashes when scrolling "The application may be doing too much work on its main thread."

我想问一下如何创建AsyncTask来检索数据并将其传递给适配器 使其更快,滚动更顺畅。

2 个答案:

答案 0 :(得分:0)

做这个例子

执行任务

new LongOperation().execute("");

,任务就是这样。

private class LongOperation extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {
                for(int i=0;i<5;i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                return "Executed";
          }      

          @Override
          protected void onPostExecute(String result) {
                TextView txt = (TextView) findViewById(R.id.output);
                txt.setText("Executed"); // txt.setText(result);
                //might want to change "executed" for the returned string passed into onPostExecute() but that is upto you
          }

          @Override
          protected void onPreExecute() {
          }

          @Override
          protected void onProgressUpdate(Void... values) {
          }
    }  

DoinBackground方法是您从服务器下载数据的地方。并在postexecute上将该数据分配给基础适配器。并且有一点是你不能从DoinBackground方法更新视图。您必须使用UIThread来更改视图。

希望它有助于!!!

答案 1 :(得分:0)

最好的方法是在创建适配器并将其设置为ListView之前在AsyncTask中下载数据。

但是,如果您在创建ListView时需要下载数据,那么在您需要实现 doInbackgound()中的所有工作函数之前,您就像 @Arman Stranger 所说的那样

F.e。下载图片后,您应将其调整为较小的尺寸,然后执行 notifyDataSetChanged()以重新绘制列表视图。