场景:有点棘手但很有趣。我已经发送了一个请求,它将给我一个 JSON 响应。此响应将进一步包含,例如 10 个 JSON 请求 URL。
然后我将向这 10 个 URL 发送请求,然后每个 URL 将包含 2 个图像 URL。这意味着总共有 20 张图像。
我的目的是ListView尽可能快地向用户展示这些图像。这是我到目前为止所做的:
第 1 步:活动开始后,弹出一个ProgressDialog显示加载圈,就像在 youtube 中一样。
第 2 步:在 ANASYNC TASK中,发送提供这 10 个 JSON 请求的 URL 的第一个请求。发送此请求,然后解析并存储这 10 个 URL 作为响应。
第 3 步:从第一个(共 10 个)开始,发送将给出 JSON 响应的请求。
第 4 步:解析此响应以获取 2 个图像 URL 并存储在 LinkedList 中。
第 5 步:因为我们现在有了图像的实际链接,所以关闭进度对话框并获取图像。
第 6 步:此图像将存储在drawable. 我做了一个BaseAdapter叫做ImageAdapterhas的习惯ArrayList<Drawable> mImages;
第 7 步:将接收到的 drawable 存储在 this 中ArrayList,使用:adapter.mImages.add(drawable);
第 8 步:然后调用adapter.notifyDataSetChanged();这将在图像准备好显示后立即更新列表视图。
第 9 步:返回第 3 步以处理更多 URL。
以下是代码(删除了所有不必要的代码):
活动类
public class ImageViewer extends Activity {
    GridView gvImage;
    private ProgressDialog progressDialog;
    private final static Integer IMAGE_LIMIT = 10;
    private ImageAdapter adapter;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            setContentView(R.layout.ImageViewer);
            gvImage = (GridView) findViewById(R.id.gvImage);
            adapter = new ImageAdapter(this);
            gvImage.setAdapter(adapter);
            progressDialog = ProgressDialog.show(ImageViewer.this, "In Progress",
                    "Loading...", true, true, new DialogInterface.OnCancelListener() {
                        public void onCancel(DialogInterface dialog) {
                            finish();
                        }
                    });
            new SendRequest().execute(null);
        } catch (Exception e) {
        }
    }
    class SendRequest extends AsyncTask {
        protected Object doInBackground(Object... params) {
            try {
                HttpClient client = new DefaultHttpClient(httpParameters);
                HttpContext localContext = new BasicHttpContext();
                HttpGet httpGet = new HttpGet(BaseRequest_URL);
                JSONObject jsonResponse = null;
                HttpResponse httpResponse = client.execute(httpGet, localContext);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = httpResponse.getEntity();
                    jsonResponse = getJSONObjectFromEntity(entity); //getJSONObjectFromEntity() will return JSONObject
                    processJSON(jsonResponse);
                }
                progressDialog.dismiss();
            } catch (Exception e) {
            }
            return null;
        }
        private void processJSON(JSONObject jsonResponse) throws JSONException {
            for (int i = 0; i < IMAGE_LIMIT; i++) {
                // Some JSON parsing. Output will be 'imageURL' which will be image URL
                displayImage(imageURL);
            }
        }
        public void displayImage(String uri150) {
            try {
                InputStream is = (InputStream) new URL(uri150).getContent();
                if(progressDialog.isShowing()){
                    progressDialog.dismiss();
                }
                Drawable d = Drawable.createFromStream(is, "image 150");
                adapter.mImages.add(d);
                handler.sendEmptyMessage(0); // Handler Below
            } catch (Exception e) {
            }
        }
        protected void onPostExecute(Object result) {
            super.onPostExecute(result);
        }
    }
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            adapter.notifyDataSetChanged();
        };
    };
}
图像适配器类:
public class ImageAdapter extends BaseAdapter {
    Context context;
    public ArrayList<Drawable> mImages = new ArrayList<Drawable>();
    public ImageAdapter(Context c) {
        this.context = c;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = new ImageView(context);
        try {
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setImageDrawable(mImages.get(position));
            imageView.setTag("Image" + position);
        } catch (Exception e) {
        }
        return imageView;
    }
}
问题:
- 我看到它的方式 - ImageAdapter被称为多次。有没有其他方法可以减少它。
- 如何优化 ImageAdapter 的代码。 
- 还有什么改进吗?