2013-04-27 1 views
2

유니버설 이미지 로더를 사용하여 플리커로 설정된 사진에서 사진 목록을 가져 오려고합니다. 내 기본 활동 ImagePagerActivity는 비동기 확장 FetchPhotos를 호출합니다. 태스크. 코드활동에서 Aync 작업에서 Array를 검색 할 수 없습니다. Android 및 Flickr 용 유니버설 이미지 로더 사용

public class ImagePagerActivity extends BaseActivity { 

private static final String STATE_POSITION = "STATE_POSITION"; 
public static final String API_KEY="mykey"; 
public static final String USER_ID="myid"; 
DisplayImageOptions options; 
private Photos thePhotoList; 
ViewPager pager; 

private String thePhotos=""; 
private final int[] timeout={3,10}; 
private String url="http://www.flickr.com/services/rest/?method=flickr.photosets.getPhotos&format=json&api_key="+API_KEY+"&photoset_id=111111111"; 
private String[] imageUrls; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ac_image_pager); 

    Bundle bundle = getIntent().getExtras(); 
    String url="http://www.flickr.com/services/rest/?method=flickr.photosets.getPhotos&format=json&api_key="+API_KEY+"&photoset_id=72157633359614452"; 
    setContentView(R.layout.pics); 

    try{ 
     ((ViewAnimator)findViewById(R.id.PictureAnimator)).removeAllViews(); 
    }catch (Exception e) {} 
    thePhotoList = new Photos(url); 
    thePhotoList.execute(); 

    imageUrls=thePhotoList.imageList; 
    //imageUrls = bundle.getStringArray(Extra.IMAGES); 
    int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 

    if (savedInstanceState != null) { 
     pagerPosition = savedInstanceState.getInt(STATE_POSITION); 
    } 

    options = new DisplayImageOptions.Builder() 
     .showImageForEmptyUri(R.drawable.ic_empty) 
     .showImageOnFail(R.drawable.ic_error) 
     .resetViewBeforeLoading() 
     .cacheOnDisc() 
     .imageScaleType(ImageScaleType.EXACTLY) 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .displayer(new FadeInBitmapDisplayer(300)) 
     .build(); 

    pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(new ImagePagerAdapter(this.imageUrls)); 
    pager.setCurrentItem(pagerPosition); 
} 

private class Photos extends com.flickr.FetchPhotos{ 
    @Override 
    public void onFetchError() {} 
    public Photos(String url) {super(ImagePagerActivity.this, url);}  
} 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(STATE_POSITION, pager.getCurrentItem()); 
} 

private class ImagePagerAdapter extends PagerAdapter { 

    private String[] images; 
    private LayoutInflater inflater; 

    ImagePagerAdapter(String[] images) { 
     this.images = images; 
     inflater = getLayoutInflater(); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((View) object); 
    } 

    @Override 
    public void finishUpdate(View container) { 
    } 

    @Override 
    public int getCount() { 
     return images.length; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup view, int position) { 
     View imageLayout = inflater.inflate(R.layout.item_pager_image, view, false); 
     ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image); 
     final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading); 

     imageLoader.displayImage(images[position], imageView, options, new SimpleImageLoadingListener() { 
      @Override 
      public void onLoadingStarted(String imageUri, View view) { 
       spinner.setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       String message = null; 
       switch (failReason.getType()) { 
        case IO_ERROR: 
         message = "Input/Output error"; 
         break; 
        case DECODING_ERROR: 
         message = "Image can't be decoded"; 
         break; 
        case NETWORK_DENIED: 
         message = "Downloads are denied"; 
         break; 
        case OUT_OF_MEMORY: 
         message = "Out Of Memory error"; 
         break; 
        case UNKNOWN: 
         message = "Unknown error"; 
         break; 
       } 
       Toast.makeText(ImagePagerActivity.this, message, Toast.LENGTH_SHORT).show(); 

       spinner.setVisibility(View.GONE); 
      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       spinner.setVisibility(View.GONE); 
      } 
     }); 

     ((ViewPager) view).addView(imageLayout, 0); 
     return imageLayout; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public void startUpdate(View container) { 
    } 
} 

}

다음 나는 이미지 호출기에 사진 클래스를 생성 한 FetchPhotos 클래스

 public abstract class FetchPhotos extends AsyncTask<Void, Void, Boolean>{ 

private Context context; 
private ProgressDialog pd; 
private String thePhotos=""; 
private String url; 
private final int[] timeout={3,10}; 

public ArrayList<PictureInfo> thePics; 
public String[] imageList; 

public FetchPhotos(Context context,String url) { 
    this.context=context; 
    this.url=url; 

} 


public String[] fillGalery(JSONObject theFeed) { 
    // TODO Auto-generated method stub 
    String[] imageUrls = null; 
    try{ 
    JSONArray Categories=theFeed.getJSONArray("photo"); 
    imageUrls=new String[Categories.length()]; 
    for (int i=0;i<(Categories.length()>15?15:Categories.length());i++){ 
     JSONObject pic = Categories.getJSONObject(i); 
     String url1="http://farm"+pic.getString("farm")+".staticflickr.com/"+pic.getString("server")+"/"+ 
       pic.getString("id")+"_"+pic.getString("secret")+".jpg"; 
     imageUrls[i]=url1; 
     System.out.println(imageUrls[i]); 

    } 

    return imageUrls; 
    } 
    catch(Exception e){ 

    } 
    return imageUrls; 

} 

@Override 
protected void onPreExecute() { 
    pd=ProgressDialog.show(context, "downloading", "please wait"); 
    super.onPreExecute(); 
} 

@Override 
protected Boolean doInBackground(Void... arg0) { 
    try{ 
     thePhotos = new Internet().GetRequest(url, null, timeout); 
     return true; 
    }catch (Exception e) { 
     return false; 
    } 
} 

@Override 
protected void onPostExecute(Boolean result) { 
    pd.dismiss(); 
    if(result){ 
     try { 
      thePhotos=thePhotos.split("\\(")[1]; 
      thePhotos.replace("\\)", ""); 
      imageList=fillGalery(new JSONObject(thePhotos).getJSONObject("photoset")); 
     } catch (Exception e) {Log.e("karp", "photolist2: "+e.getMessage());onFetchError();onFetchError();} 
    }else{ 
     onFetchError(); 
    } 
    super.onPostExecute(result); 
} 


public abstract void onFetchError(); 

public void LoadPhoto(PictureInfo pi){ 
    Log.d("karp", "LoadPhoto"); 
    if(!(pi.executed)){ 
     new LoadPics(pi).execute(); 
     pi.executed=true; 
    } 
} 


private class LoadPics extends RemoteImage{ 
    private ImageView ivTarget; 
    private ProgressBar pb; 
    public LoadPics(PictureInfo pi) { 
     super(pi.url); 
     this.ivTarget=pi.iv; 
     this.pb=pi.pb; 
    }  
    @Override 
    public void onSuccess(Bitmap remoteBitmap) { 
     try{ 
      pb.setVisibility(View.INVISIBLE); 
      ivTarget.setImageBitmap(remoteBitmap); 
     }catch (Exception e) {} 
    }  
    @Override 
    public void onFail() {pb.setVisibility(View.INVISIBLE);} 
} 

}

이다 따릅니다 다음 임 채우기 갤러리 에 액세스하려고 이제 Flickr에서 이미지 URL로 문자열 배열을 채우려고합니다. usin g

thePhotoList = new Photos(url); 
    thePhotoList.execute(); 

    imageUrls=thePhotoList.imageList; 

를 호출 내 기본 활동 메신저에서 문자열 배열

을 reurns하지만 난 문자열 배열입니다 imageUrls의 배열을 취득하지 못할 수 있으므로 시도하는 방법 fillGallery.

이미지에 URL이있는 하드 코딩 된 문자열 배열을 사용하면 코드가 작동합니다. 도움이 될 것입니다. 나는 확실히 이것에 새로운 것처럼 뭔가 바보처럼 행동하고있다. 많은 감사. 건배!

답변

0

나는 그것을 작동시켰다. 리스너 인터페이스를 추가하려면 onPostExecute, 에서 메소드를 호출해야합니다. 액티비티에서이를 구현하고 리스너 추상 메소드의 구현에서 변수에 액세스하십시오. 게시하기 전에 조금 더 조사해야했는데 문제가 너무 오래 지속되었습니다. 사과.

+0

감사합니다. 내 질문에 이미 답변되었습니다. –