2014-02-24 220 views
0

有没有人有一个使用通用图像加载器的例子,在这种情况下,从Web服务中填充imageurl JSON,我想使用imagepager,但是在示例中,URL是硬编码的。我认为这将是一个常见的用法。json的通用图像加载器

回答

2

不知道这会有多大的帮助,但也许它会有所帮助。我把它从我的应用程序中剥离出来,所以我不得不掩盖这些URL。

我PhotosActivity

public class PhotosActivity extends Activity { 

    ImageLoader mImageLoader = ImageLoader.getInstance(); 

    DisplayImageOptions mDisplayImageOptions; 
    String mPhotosBaseUrl = "http://app.MyApp.com/feeds/gallery-v2.php?v=1.1.4"; 
    String mGalleryToView = E_GALLERY; 

    protected boolean mPauseOnScroll = true; 
    protected boolean mPauseOnFling = true; 

    ProgressBar mSpinner; 
    ConnectionChecker mInetChecker = new ConnectionChecker(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); 
     overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 

     setContentView(R.layout.photos_activity); 

     //Check for logged in user. 
     mCurrentUser = User.getCurrentUser(this); 

     mSpinner = (ProgressBar) findViewById(R.id.loading); 
     mSpinner.setVisibility(View.VISIBLE); 

     Bundle bundle = getIntent().getExtras(); 
     assert bundle != null; 
     mGalleryToView = bundle.getString("gallery"); 

     if (mInetChecker.isInternetConnectionPresent()){ 
      PhotoFetcher fetcher = new PhotoFetcher(); 
      fetcher.execute(); 
     }else{ 
      AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); 

      dlgAlert.setMessage(getString(R.string.no_internet_description_text)); 
      dlgAlert.setTitle(getString(R.string.check_internet_connection_dialog_title_text)); 
      dlgAlert.setPositiveButton(getString(R.string.ok_button_text), null); 
      dlgAlert.setCancelable(true); 
      dlgAlert.setPositiveButton("Ok", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          failedGettingPhotos("No connection."); 
         } 
        }); 
      dlgAlert.create().show(); 
     } 

     mDisplayImageOptions = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.ic_stub) 
       .showImageForEmptyUri(R.drawable.ic_stub) 
       .showImageOnFail(R.drawable.ic_error) 
       .cacheInMemory(true) 
       .cacheOnDisc(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 
     if (!mImageLoader.isInited()){ 
     initImageLoader(getApplicationContext()); 
     } 

    } 

    private class PhotoFetcher extends AsyncTask<Void, Void, PhotosResponse> { 
     private static final String TAG = "PhotoFetcher"; 

     @Override 
     protected PhotosResponse doInBackground(Void... params) { 
      PhotosResponse returnResponse = null; 
      try { 
       //Create an HTTP client 
       HttpClient client = new DefaultHttpClient(); 
       HttpPost post = new HttpPost(mPhotosBaseUrl + mGalleryToView); 

       //Perform the request and check the status code 
       HttpResponse response = client.execute(post); 
       StatusLine statusLine = response.getStatusLine(); 
       if(statusLine.getStatusCode() == 200) { 
        HttpEntity entity = response.getEntity(); 
        InputStream content = entity.getContent(); 

        try { 
         //Read the server response and attempt to parse it as JSON 
         Reader reader = new InputStreamReader(content); 

         Gson gson = new Gson(); 
         returnResponse= gson.fromJson(reader, PhotosResponse.class); 

         content.close(); 

        } catch (Exception ex) { 
         Log.e(TAG, "Failed to parse JSON due to: " + ex); 
         BugSenseHandler.sendException(ex); 
         failedGettingPhotos("Failed to parse JSON due to: " + ex); 
        } 
       } else { 
        Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode()); 
        failedGettingPhotos("Server responded with status code: " + statusLine.getStatusCode()); 
       } 
      } catch(Exception ex) { 
       Log.e(TAG, "Failed to send HTTP POST request due to: " + ex); 
       BugSenseHandler.sendException(ex); 
       failedGettingPhotos("Failed to send HTTP POST request due to: " + ex); 
      } 
      return returnResponse; 
     } 

     @Override 
     protected void onPostExecute(PhotosResponse resultResponse) { 
      //Set the Application wide var. 
      ((MyAppClass) getApplication()).setPhotosResponse(resultResponse); 

      mSpinner.setVisibility(View.GONE); 

      PhotosResultsHandler resultsHandler = new PhotosResultsHandler(); 
      resultsHandler.execute(resultResponse); 

     } 

    } 

    private class PhotosResultsHandler extends AsyncTask<PhotosResponse, Void, String> { 
     private static final String TAG = "EventsResultsHandler"; 

     @Override 
     protected String doInBackground(PhotosResponse... params) { 

      try { 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         mSpinner.setVisibility(View.GONE); 

         GridView listView = (GridView) findViewById(R.id.gridview); 
         listView.setAdapter(new ImageAdapter()); 
         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
          @Override 
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
           startImagePagerActivity(position); 
          } 
         }); 

         listView.setOnScrollListener(new PauseOnScrollListener(mImageLoader, mPauseOnScroll, mPauseOnFling)); 
        } 
       }); 

      } catch(Exception ex) { 
       Log.e(TAG, "Failed to update results due to: " + ex); 
       failedGettingPhotos(""); 
      } 
      return null; 
     } 

    } 

    private void failedGettingPhotos(final String msg) { 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mSpinner.setVisibility(View.GONE); 
       Toast.makeText(PhotosActivity.this, "Failed to get photos: " + msg, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    private void startImagePagerActivity(int position) { 
     Intent intent = new Intent(this, ImagePagerActivity.class); 

     intent.putExtra("image_position", position); 
     startActivity(intent); 
    } 

    public class ImageAdapter extends BaseAdapter { 
     @Override 
     public int getCount() { 
      return ((MyAppClass) getApplication()).getPhotosResponse().getPhotos().getPhoto().length; 
     } 

     @Override 
     public Object getItem(int position) { 
      return null; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      View view = convertView; 
      if (view == null) { 
       view = getLayoutInflater().inflate(R.layout.item_grid_image, parent, false); 
       holder = new ViewHolder(); 
       assert view != null; 
       holder.imageView = (ImageView) view.findViewById(R.id.image); 
       holder.progressBar = (ProgressBar) view.findViewById(R.id.progress); 
       view.setTag(holder); 
      } else { 
       holder = (ViewHolder) view.getTag(); 
      } 

      Photo photogs[] = ((MyAppClass) getApplication()).getPhotosResponse().getPhotos().getPhoto(); 
      Photo photog = photogs[position]; 
      String uri = photog.getUrl_t(); 

      mImageLoader.displayImage(uri, holder.imageView, mDisplayImageOptions, new ImageLoadingListener() { 
       @Override 
       public void onLoadingStarted(String imageUri, View view) { 
        holder.progressBar.setProgress(0); 
        holder.progressBar.setVisibility(View.VISIBLE); 
       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, 
              FailReason failReason) { 
        holder.progressBar.setVisibility(View.GONE); 
       } 

       @Override 
       public void onLoadingCancelled(String imageUri, View view) { 
        holder.progressBar.setVisibility(View.GONE); 
       } 

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

      } 
      ); 

      return view; 
     } 

     class ViewHolder { 
      ImageView imageView; 
      ProgressBar progressBar; 
     } 
    } 

    public static void initImageLoader(Context context) { 
     // This configuration tuning is custom. You can tune every option, you may tune some of them, 
     // or you can create default configuration by 
     // ImageLoaderConfigu 
     // ration.createDefault(this); 
     // method. 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
       .threadPriority(Thread.NORM_PRIORITY - 2) 
       .denyCacheImageMultipleSizesInMemory() 
       .discCacheFileNameGenerator(new Md5FileNameGenerator()) 
       .tasksProcessingOrder(QueueProcessingType.LIFO) 
       //.writeDebugLogs() // Remove for release app 
       .build(); 
     // Initialize ImageLoader with configuration. 
     ImageLoader.getInstance().init(config); 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
    } 
} 

这里是图片寻呼机类。

版权所有2011-2013 Sergey Tarasevich * *授权,根据Apache 许可证,版本2.0(“许可证”); *除遵守许可证外,您不得使用此文件。 *您可以在* * http://www.apache.org/licenses/LICENSE-2.0 * *上获得许可证副本 *除非适用法律要求或书面同意,否则根据许可证分发的软件*是“按现状”分发的,*没有任何保证或条件任何类型,无论是表示或 暗示。 *请参阅许可证以了解许可证下的特定语言管理 权限和*限制。

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 

import uk.co.senab.photoview.PhotoViewAttacher; 

public class ImagePagerActivity extends Activity { 

    private static final String STATE_POSITION = "STATE_POSITION"; 
    ImageButton mImageButtonBack; 
    DisplayImageOptions mDisplayImageOptions; 

    ViewPager mPager; 
    PhotoViewAttacher mAttacher = null; 
    ImageLoader mImageLoader = ImageLoader.getInstance(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); 

     overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 

     setContentView(R.layout.ac_image_pager); 

     Bundle bundle = getIntent().getExtras(); 
     assert bundle != null; 
     //Get image position. 
     int pagerPosition = bundle.getInt("image_position", 0); 

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



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

     mPager = (ViewPager) findViewById(R.id.pager); 

     mPager.setAdapter(new ImagePagerAdapter(((MyAppClass) this.getApplication()).getPhotosResponse().getPhotos().getPhoto())); 
     mPager.setCurrentItem(pagerPosition); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putInt(STATE_POSITION, mPager.getCurrentItem()); 
    } 

    private class ImagePagerAdapter extends PagerAdapter { 

     private Photo[] photos; 
     //private PhotoResult[] photos; 
     private LayoutInflater inflater; 

     ImagePagerAdapter(Photo[] photos) { 
      this.photos = photos; 
      inflater = getLayoutInflater(); 
     } 

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

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

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

      mImageLoader.displayImage(photos[position].getUrl_m(), imageView, mDisplayImageOptions, 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: 
          //Let's swallow this one. I have seen it and it did not 
          //appear to have any effect. 
          //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); 
       } 
      }); 

      TextView captionTV = (TextView) imageLayout.findViewById(R.id.photo_caption_textView); 
      captionTV.setText(photos[position].getTitle()); 

      mAttacher = new PhotoViewAttacher(imageView); 

      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 onBackPressed() { 
     super.onBackPressed(); 
     overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 
    } 
} 
+0

感谢道格,这基本上就是我一直在寻找,我会尝试,让你知道如何去。我真的认为NOSTRA或其他涉及UIL的人应该做这个过程的一个例子,可能使用Flickr API作为Web服务。 – user3344903

+0

当然希望它有帮助。另外,我正在使用Gson进行JSON解析。它使这部分非常简单。 – Doug

相关问题