异步任务运行速度很慢

时间:2013-07-28 02:54:41

标签: image listview android-asynctask

我正在使用异步代码从for循环中的web获取图像。请建议我该怎样做才能快速生成此列表。我将这些数据传递给listview。

private class CreateItems extends AsyncTask<Void, Void, Void>{
    protected Void doInBackground(Void... params) {
        android.os.Debug.waitForDebugger();
        SharedPreferences sp = getSharedPreferences(UserDataManagement.CATALOG, 0);
        String items = sp.getString("items", "");
        try {
            JSONArray array = new JSONArray(items);
            for(int i=0;i<array.length();i++){
                JSONObject item = array.getJSONObject(i);
                String id = item.getString("id");
                String firstName = item.getString("first_name");
                String lastName = item.getString("last_name");
                String imageUrl = item.getString("image");
                InputStream in = new java.net.URL(imageUrl).openStream();
                Bitmap imageBitmap = BitmapFactory.decodeStream(in);
                in.close();
                Item item = new Item(id, firstName, lastName, imageUrl, imageBitmap);
                itemList.add(item);
               /* if(i!=0 && i%10==0){
                    runOnUiThread(new Runnable() {
                        public void run() {
                            adapter.notifyDataSetChanged();
                        }
                    });
                }*/
           }
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
       return null;
    }

    protected void onPostExecute(Void result) {
        adapter.notifyDataSetChanged();
    }
}

2 个答案:

答案 0 :(得分:0)

您应该在循环中创建异步任务,以便并行地从Web获取图像。

答案 1 :(得分:0)

最终的解决方案是创建一个新的Thread而不是异步任务,并使用倒计时锁存器立即启动它。我认为我以前的异步任务无法在通话后立即启动或者被其他东西阻止。为了通过网络获取图像,我使用了AsyncHttpClient。

final java.util.concurrent.CountDownLatch latch = new CountDownLatch(1);
    Thread getInfo = new Thread(new Runnable() {
        @Override
        public void run() {
            latch.countDown();
                            do something
                            runOnUiThread(new Runnable() {
                                public void run() {
                                   list.add(item);
                                   adapter.notifyDataSetChanged();
                                }
                            });
                  }
    });

            getInfo.start();
    try {
        latch.await();
    }
    catch(InterruptedException ex){
        ex.printStackTrace();
    }