Android 无法使用AsyncTask加载图像
我有一个场景,需要在加载主页时从URL检索图像。主页由30个图像组成,最初只加载了10个图像。进一步滚动后,会检索其他图像(我不是指PullToRefresh功能)。我正在StaggedGridView(Github的库)中设置图像。我能够从WebService call加载所有图像,并且能够在logcat中打印其名称,但是无法设置除第一个图像之外的所有图像。当滚动调用第二个asyn任务(加载接下来的10个图像)时,也只设置来自第二个异步任务(也是第一个图像)的图像(这里参考第11个图像)。我已将notifyDataSetChanged调用到适配器,但它会引发NullPointerException 代码:Android 无法使用AsyncTask加载图像,android,gridview,android-asynctask,Android,Gridview,Android Asynctask,我有一个场景,需要在加载主页时从URL检索图像。主页由30个图像组成,最初只加载了10个图像。进一步滚动后,会检索其他图像(我不是指PullToRefresh功能)。我正在StaggedGridView(Github的库)中设置图像。我能够从WebService call加载所有图像,并且能够在logcat中打印其名称,但是无法设置除第一个图像之外的所有图像。当滚动调用第二个asyn任务(加载接下来的10个图像)时,也只设置来自第二个异步任务(也是第一个图像)的图像(这里参考第11个图像)。我已
mGridView = (StaggeredGridView) findViewById(R.id.grid_view);
context = getApplicationContext();
new WebServicesClass();
mGridView.setOnScrollListener(this);
mGridView.setOnItemClickListener(this);
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(SAVED_DATA_KEY, mData);
}
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
Log.d(TAG, "onScrollStateChanged:" + scrollState);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {
Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem +
" visibleItemCount:" + visibleItemCount +
" totalItemCount:" + totalItemCount);
// our handling
if (!mHasRequestedMore) {
System.out.println("Inside the requested more");
int lastInScreen = firstVisibleItem + visibleItemCount;
// if (lastInScreen >= totalItemCount) {
Log.d(TAG, "onScroll lastInScreen - so load more");
mHasRequestedMore = true;
new WebServicesClass().onLoadMoreItems();
mAdapter.notifyDataSetChanged();
mHasRequestedMore = false;
//}
}
}
WebServicesClass:
mGridView = (StaggeredGridView) findViewById(R.id.grid_view);
context = getApplicationContext();
new WebServicesClass();
mGridView.setOnScrollListener(this);
mGridView.setOnItemClickListener(this);
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(SAVED_DATA_KEY, mData);
}
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
Log.d(TAG, "onScrollStateChanged:" + scrollState);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {
Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem +
" visibleItemCount:" + visibleItemCount +
" totalItemCount:" + totalItemCount);
// our handling
if (!mHasRequestedMore) {
System.out.println("Inside the requested more");
int lastInScreen = firstVisibleItem + visibleItemCount;
// if (lastInScreen >= totalItemCount) {
Log.d(TAG, "onScroll lastInScreen - so load more");
mHasRequestedMore = true;
new WebServicesClass().onLoadMoreItems();
mAdapter.notifyDataSetChanged();
mHasRequestedMore = false;
//}
}
}
doInBackGround()的内容如下:
String image_url = "http://demo.bsetec.com/fancyclone/uploads/approved_items/"
+ first_image;
// System.out.println("The image url is " +
// image_url);
URL url = new URL(image_url);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException(
"Not an HTTP connection");
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
compressed_image = image;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
options.inJustDecodeBounds = true;
options.inSampleSize = 1;
options.inJustDecodeBounds = false;
image = BitmapFactory.decodeStream(in,
null, options);
}
} catch (Exception ex) {
throw new IOException("Error connecting");
}
item = new RowItem(image, product_name, cost,
product_id, dream_status,username);
rowItems.add(item);
其中item是holder类的对象,holder类具有get、set方法,rowItems是类型为holder类的列表的对象
MainActivty.java:
mGridView = (StaggeredGridView) findViewById(R.id.grid_view);
context = getApplicationContext();
new WebServicesClass();
mGridView.setOnScrollListener(this);
mGridView.setOnItemClickListener(this);
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(SAVED_DATA_KEY, mData);
}
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
Log.d(TAG, "onScrollStateChanged:" + scrollState);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {
Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem +
" visibleItemCount:" + visibleItemCount +
" totalItemCount:" + totalItemCount);
// our handling
if (!mHasRequestedMore) {
System.out.println("Inside the requested more");
int lastInScreen = firstVisibleItem + visibleItemCount;
// if (lastInScreen >= totalItemCount) {
Log.d(TAG, "onScroll lastInScreen - so load more");
mHasRequestedMore = true;
new WebServicesClass().onLoadMoreItems();
mAdapter.notifyDataSetChanged();
mHasRequestedMore = false;
//}
}
}
我很乐意帮助澄清。提前谢谢 你可以告诉我们eimageloader:)我在加载图像方面没有任何问题,我只是缺少了一些限制我显示所有图像的内容。好吧,我找到另一种方法来回答你的问题……)