Android 使用AsyncHttpResponseHandler的多个调用
我正在开发一个应用程序,它可以将网站上的json数据列表加载到列表中。在该列表中,每个项目都有一个与其关联的图像。MediaAdapter处理每一行,并为每个映像调用异步加载 这个问题来之不易。目前列表中有3个项目和3个图像。有时我会收到一个图像回来,其他时间2。我很少收到全部3张图片。我已经建立了日志记录,并在不破解android异步http的情况下尽我所能进行了跟踪 在下面的日志中,请注意,onStart是为joe_thumb_804587.jpg调用的,但我从未收到异常或该请求的任何进一步更新 下面是一些代码和一些日志记录 媒体适配器注意:MediaLoader.fetchBinary是对BinaryNetworkClass的传递: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调用的,但我从未收到异常或该请求的任何进一步
@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快照库
一旦更新,一切都按预期进行