Android 使用AsyncHttpResponseHandler的多个调用

Android 使用AsyncHttpResponseHandler的多个调用,android,android-async-http,loopj,Android,Android Async Http,Loopj,我正在开发一个应用程序,它可以将网站上的json数据列表加载到列表中。在该列表中,每个项目都有一个与其关联的图像。MediaAdapter处理每一行,并为每个映像调用异步加载 这个问题来之不易。目前列表中有3个项目和3个图像。有时我会收到一个图像回来,其他时间2。我很少收到全部3张图片。我已经建立了日志记录,并在不破解android异步http的情况下尽我所能进行了跟踪 在下面的日志中,请注意,onStart是为joe_thumb_804587.jpg调用的,但我从未收到异常或该请求的任何进一步

我正在开发一个应用程序,它可以将网站上的json数据列表加载到列表中。在该列表中,每个项目都有一个与其关联的图像。MediaAdapter处理每一行,并为每个映像调用异步加载

这个问题来之不易。目前列表中有3个项目和3个图像。有时我会收到一个图像回来,其他时间2。我很少收到全部3张图片。我已经建立了日志记录,并在不破解android异步http的情况下尽我所能进行了跟踪

在下面的日志中,请注意,onStart是为joe_thumb_804587.jpg调用的,但我从未收到异常或该请求的任何进一步更新

下面是一些代码和一些日志记录

媒体适配器注意:MediaLoader.fetchBinary是对BinaryNetworkClass的传递:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null){
            convertView = ((Activity)this.getContext()).getLayoutInflater()
                    .inflate(R.layout.media_list_item, null);
        }

        TextView title = (TextView)convertView.findViewById(R.id.title);
        TextView keywords = (TextView) convertView.findViewById(R.id.keywords);
        ImageView thumb = (ImageView) convertView.findViewById(R.id.photo);

        title.setText(getItem(position).getTitle());
        keywords.setText(getItem(position).getKeywords());

        fetchThumbnailsInView(thumb, getItem(position).getDefaultThumbnailUrl());

        return convertView;
    }


    private void fetchThumbnailsInView(final ImageView imageView, final String url) {

        String[] split = url.split("/");

        final String fileName = split[split.length - 1];

        MediaLoader.fetchBinary(url, new NetworkClientListener() {
            @Override
            public void success(Object data) {

                if (data instanceof byte[]) {

                    byte[] imageData = (byte[]) data;
                    Bitmap b = BitmapFactory.decodeStream(new ByteArrayInputStream(imageData));

                    imageView.setImageBitmap(b);

                    Log.d(TAG, "Setting  fileName: " + fileName + " for imageView: " + imageView.toString());
                }
                else{
                    Log.e(TAG, "Didn't receive a byte array for url: " + url);
                }
            }

            @Override
            public void failure(Throwable throwable) {
                Log.e(TAG, Log.getStackTraceString(throwable));
            }
        });
    }
public class BinaryNetworkClient {
    private static final AsyncHttpClient mHttpClient = new AsyncHttpClient();
    private static final String TAG = "BinaryNetworkClient";

    public static void getData(final String url, final NetworkClientListener<byte[]> listener){
        String[] split = url.split("/");

        final String fileName = split[split.length - 1];

        Log.d(TAG, "Requesting BINARY data for fileName: " + fileName);

        mHttpClient.get(url, new AsyncHttpResponseHandler(){

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if (listener != null) {
                    Log.d(TAG, "Received BINARY data for fileName: " + fileName);

                    listener.success(responseBody);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                if (listener != null) {
                    Log.e(TAG, "Requesting BINARY FAILED for fileName: " + fileName);

                    listener.failure(error);
                }
            }

            @Override
            public void onRetry() {
                super.onRetry();
                Log.i(TAG, "Retry called for fileName: " + fileName);
            }

            @Override
            public void onStart() {
                super.onStart();
                Log.i(TAG, "Start called for fileName: " + fileName);

            }

            @Override
            public void onFinish() {
                super.onFinish();
                Log.i(TAG, "Finish called for fileName: " + fileName);
            }

            @Override
            public void onProgress(int bytesWritten, int totalSize) {
                super.onProgress(bytesWritten, totalSize);

                Log.i(TAG, "OnProgress called for fileName: " + fileName + " (" + bytesWritten + " / " +  totalSize + ") ");
            }

        });
    }
}
BinaryNetworkClass:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null){
            convertView = ((Activity)this.getContext()).getLayoutInflater()
                    .inflate(R.layout.media_list_item, null);
        }

        TextView title = (TextView)convertView.findViewById(R.id.title);
        TextView keywords = (TextView) convertView.findViewById(R.id.keywords);
        ImageView thumb = (ImageView) convertView.findViewById(R.id.photo);

        title.setText(getItem(position).getTitle());
        keywords.setText(getItem(position).getKeywords());

        fetchThumbnailsInView(thumb, getItem(position).getDefaultThumbnailUrl());

        return convertView;
    }


    private void fetchThumbnailsInView(final ImageView imageView, final String url) {

        String[] split = url.split("/");

        final String fileName = split[split.length - 1];

        MediaLoader.fetchBinary(url, new NetworkClientListener() {
            @Override
            public void success(Object data) {

                if (data instanceof byte[]) {

                    byte[] imageData = (byte[]) data;
                    Bitmap b = BitmapFactory.decodeStream(new ByteArrayInputStream(imageData));

                    imageView.setImageBitmap(b);

                    Log.d(TAG, "Setting  fileName: " + fileName + " for imageView: " + imageView.toString());
                }
                else{
                    Log.e(TAG, "Didn't receive a byte array for url: " + url);
                }
            }

            @Override
            public void failure(Throwable throwable) {
                Log.e(TAG, Log.getStackTraceString(throwable));
            }
        });
    }
public class BinaryNetworkClient {
    private static final AsyncHttpClient mHttpClient = new AsyncHttpClient();
    private static final String TAG = "BinaryNetworkClient";

    public static void getData(final String url, final NetworkClientListener<byte[]> listener){
        String[] split = url.split("/");

        final String fileName = split[split.length - 1];

        Log.d(TAG, "Requesting BINARY data for fileName: " + fileName);

        mHttpClient.get(url, new AsyncHttpResponseHandler(){

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if (listener != null) {
                    Log.d(TAG, "Received BINARY data for fileName: " + fileName);

                    listener.success(responseBody);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                if (listener != null) {
                    Log.e(TAG, "Requesting BINARY FAILED for fileName: " + fileName);

                    listener.failure(error);
                }
            }

            @Override
            public void onRetry() {
                super.onRetry();
                Log.i(TAG, "Retry called for fileName: " + fileName);
            }

            @Override
            public void onStart() {
                super.onStart();
                Log.i(TAG, "Start called for fileName: " + fileName);

            }

            @Override
            public void onFinish() {
                super.onFinish();
                Log.i(TAG, "Finish called for fileName: " + fileName);
            }

            @Override
            public void onProgress(int bytesWritten, int totalSize) {
                super.onProgress(bytesWritten, totalSize);

                Log.i(TAG, "OnProgress called for fileName: " + fileName + " (" + bytesWritten + " / " +  totalSize + ") ");
            }

        });
    }
}
找到了答案

需要更新我使用的1.4.4的1.4.5快照库

一旦更新,一切都按预期进行