user3344903
user3344903

Reputation: 1

Universal image loader from json

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

Answers (1)

Doug
Doug

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

Related Questions