Java 如何在适配器中使用后台任务?
我有一个图像适配器,它应该负责更新图像网格。问题是我运行了一个BackgroundImageTask,它从URL获取位图。getView方法在后台任务完成更新之前返回imageView。如何强制后台任务在返回imageview之前完成Java 如何在适配器中使用后台任务?,java,android,multithreading,background,task,Java,Android,Multithreading,Background,Task,我有一个图像适配器,它应该负责更新图像网格。问题是我运行了一个BackgroundImageTask,它从URL获取位图。getView方法在后台任务完成更新之前返回imageView。如何强制后台任务在返回imageview之前完成 public class ImageAdapter extends BaseAdapter { private Context mContext; Bitmap bitmap; List<Post> postList; ImageView imageV
public class ImageAdapter extends BaseAdapter {
private Context mContext;
Bitmap bitmap;
List<Post> postList;
ImageView imageView;
int pos;
public ImageAdapter(Context c, List<Post> p) {
mContext = c;
postList = p;
}
public int getCount() {
return postList.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
pos=position;
View convert = convertView;
if (convert == null) {
// if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 320));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(0, 0, 0, 0);
} else {
imageView = (ImageView) convert;
}
new BackgroundImageTask().execute();
return imageView;
}
public View SetBit(Bitmap b){
imageView.setImageBitmap(b);
return imageView;
}
class BackgroundImageTask extends AsyncTask<Void, Void, Bitmap> {
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap bit1=bitmap;
try {
bit1 = BitmapFactory.decodeStream((InputStream)new URL(postList.get(pos).thumbnail).getContent());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bit1;
}
@Override
protected void onPostExecute(Bitmap bit) {
SetBit(bit);
}
}
公共类ImageAdapter扩展了BaseAdapter{
私有上下文;
位图;
列表postList;
图像视图图像视图;
int pos;
公共ImageAdapter(上下文c,列表p){
mContext=c;
postList=p;
}
public int getCount(){
返回postList.size();
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
pos=位置;
视图转换=转换视图;
if(convert==null){
//如果没有回收,初始化一些属性
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(GridView.AUTO_-FIT,320));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
setPadding(0,0,0,0);
}否则{
imageView=(imageView)转换;
}
新建BackgroundImageTask().execute();
返回图像视图;
}
公共视图设置(位图b){
设置图像位图(b);
返回图像视图;
}
类BackgroundImageTask扩展了AsyncTask{
@凌驾
受保护位图doInBackground(无效…参数){
位图bit1=位图;
试一试{
bit1=BitmapFactory.decodeStream((InputStream)新URL(postList.get(pos.缩略图).getContent());
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回比特1;
}
@凌驾
受保护的void onPostExecute(位图位){
SetBit(bit);
}
}
}在您的情况下:
您需要确保任务何时完成并启动setAdapter
getStatus()
检查AsyncTask
是挂起、正在运行还是已完成
尝试以下方法
LoadImageInBackground loadTask = new LoadImageInBackground();
if(loadTask.getStatus() == AsyncTask.Status.PENDING){
// My AsyncTask has not started yet
}
if(loadTask.getStatus() == AsyncTask.Status.RUNNING){
// My AsyncTask is currently doing work in doInBackground()
}
if(loadTask.getStatus() == AsyncTask.Status.FINISHED){
// My AsyncTask is done and onPostExecute was called
}
相反,您可以将ImageView对象传递给后台任务,如
new BackgroundImageTask(imageView).execute();
及
class BackgroundImageTask扩展了AsyncTask{
ImageView iv;
BackgroundImageTask(ImageView ImageView){
iv=图像视图;
}
@凌驾
受保护位图doInBackground(无效…参数){
位图bit1=位图;
试一试{
bit1=BitmapFactory.decodeStream((InputStream)新URL(postList.get(pos.缩略图).getContent());
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回比特1;
}
@凌驾
受保护的void onPostExecute(位图位){
iv.设置图像位图(位);
}
}
在哪里执行此操作?这取决于setadapter(ImageAdapter)方法的位置。
class BackgroundImageTask extends AsyncTask<Void, Void, Bitmap> {
ImageView iv;
BackgroundImageTask(ImageView imageView){
iv = imageView;
}
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap bit1=bitmap;
try {
bit1 = BitmapFactory.decodeStream((InputStream)new URL(postList.get(pos).thumbnail).getContent());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bit1;
}
@Override
protected void onPostExecute(Bitmap bit) {
iv.setImageBitmap(bit);
}
}