0

我正在使用异步代码在 for 循环中从 Web 获取图像。请建议我可以做些什么来快速生成这个列表。我将此数据传递给列表视图。

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

2 回答 2

0

最终可行的解决方案是创建一个新线程而不是异步任务,并使用倒计时锁存器使其立即启动。我认为我之前的异步任务无法在通话后立即启动,或者会被其他东西阻止。为了通过网络获取图像,我使用了 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();
    }
于 2013-07-30T00:39:19.020 回答
0

您应该在一个循环中创建异步任务,该任务将从 Web 中并行获取图像。

于 2013-07-29T07:21:09.863 回答