2017-03-29 2 views
0

이미지 격자 업데이트를 처리하는이 이미지 어댑터가 있습니다. 문제는 URL에서 비트 맵을 가져 오는 BackgroundImageTask를 실행하고 있다는 것입니다. 백그라운드 태스크가 업데이트를 완료하기 전에 getView 메소드가 imageView를 리턴합니다. 어떻게하면 이미지 뷰를 반환하기 전에 백그라운드 작업을 강제 종료 할 수 있습니까? 귀하의 경우에는어댑터에서 백그라운드 작업을 사용하려면 어떻게해야합니까?

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); 
    } 
} 

}

답변

0

:

당신은 작업이 완료되면 확인하고는, 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 
} 
+0

같은 배경 작업에 이미지 뷰 개체를 전달할 수 있습니다? –

+0

그것은 setadapter (ImageAdapter) 메소드의 위치에 따라 다릅니다. – nikeru8

0

대신 당신은

new BackgroundImageTask(imageView).execute(); 

내가 이런 짓을 했을까

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); 
} 
}