Reputation: 1
Does anyone have an example of using the universal image loader with the imageurl being populated from a web service in this case JSON, I would like to use the imagepager however the urls are hard coded in the example. I think this would be a common usage.
Upvotes: 0
Views: 638
Reputation: 2001
Not sure how much help this will be but maybe it will help. I ripped it out of my app so I had to mask the URLs.
My 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);
}
}
And here is the Image Pager class.
Copyright 2011-2013 Sergey Tarasevich * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License.
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);
}
}
Upvotes: 2