Imageloader for displaying the Image in an activity - java

Check this URL I am USING :: http://54.218.73.244:7006/DescriptionSortedRating/
Images will append with relative path from JSON out put using restaurantIMAGE
EX::
http://54.218.73.244:7006/CopperChimney1.jpg
I am using restaurantIMAGE from JSON
{
"restaurants": [
{
"restaurantID": 4,
"restaurantNAME": "CopperChimney1",
"restaurantIMAGE": "MarkBoulevard1.jpg",
"restaurantDISTANCE": 15,
"restaurantTYPE": "Indian",
"restaurantRATING": 1,
"restaurantPrice": 11,
"restaurantTime": "9am t0 8pm"
},
{
"restaurantID": 1,
"restaurantNAME": "CopperChimney",
"restaurantIMAGE": "CopperChimney.png",
"restaurantDISTANCE": 5,
"restaurantTYPE": "Indian",
"restaurantRATING": 3,
"restaurantPrice": 20,
"restaurantTime": "8pm to 11pm"
},
I am USING IMAGE LOADER
ImageLoader.java
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
}
final int stub_id = R.drawable.temp_img;
public void DisplayImage(String url, ImageView imageView) {
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null)
imageView.setImageBitmap(bitmap);
else {
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null)
return b;
// Download Images from the Internet
try {
Bitmap bitmap = null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if (ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
// Decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
// Find the correct scale value. It should be the power of 2.
// Recommended Size 512
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
#Override
public void run() {
try {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
} catch (Throwable th) {
th.printStackTrace();
}
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
Utils,FileCache,MemoryCache java files are also there
RestaurantDescPhotos.java
public class RestaurantDescPhotos extends Activity {
// url to make request
private static String url = "http://54.218.73.244:7006/DescriptionSortedRating/";
String restaurant_name, cc_res;
ProgressDialog progressDialog;
JSONObject jsonObject;
JSONArray first_array;
ImageLoader imageLoader;
TextView textView;
TextView text;
private SparseArray<String> imagesMap = new SparseArray<String>();
ArrayList<HashMap<String, String>> list_of_images = new ArrayList<HashMap<String, String>>();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.restaurant_desc_photos);
imageLoader=new ImageLoader(RestaurantDescPhotos.this);
progressDialog = new ProgressDialog(RestaurantDescPhotos.this);
new ParsingAsync().execute();
}
private class ParsingAsync extends AsyncTask<Void, Void, Void> {
#Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(RestaurantDescPhotos.this, "",
"Please Wait", true, false);
}
#Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
String _response = null;
try {
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(
CoreProtocolPNames.PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);
HttpGet request = new HttpGet(url);
HttpResponse response = httpclient.execute(request);
HttpEntity resEntity = response.getEntity();
_response = EntityUtils.toString(resEntity);
jsonObject = new JSONObject(_response);
first_array = jsonObject.getJSONArray("restaurants");
} catch (JSONException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
progressDialog.dismiss();
// TextView timedisplay=(TextView)
// findViewById(R.id.RestaurantTimeID);
for (int i = 0; i < first_array.length(); i++) {
try {
JSONObject detail_obj = first_array.getJSONObject(i);
HashMap<String, String> map_for_images = new HashMap<String, String>();
int id = detail_obj.getInt("_id");
String IMAGES = "http://54.218.73.244:7006/"+detail_obj.getString("restaurantIMAGE");
map_for_images.put("Starters", IMAGES);
list_of_images.add(map_for_images);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ImageView imageView = (ImageView) findViewById(R.id.DISP_IMG);
imageLoader.DisplayImage(url, imageView);
}
}
}
I am facing the problems in setting the images onto image view using image loader
There is some problem in RestaurantDescPhotos.java ... I am not able to figure it out
Any Ideas

The url content is not a valid image url:
imageLoader.DisplayImage(url, imageView);
I tried a fixed image url, and image is loaded successfully:
String path = "http://54.218.73.244:7006/CopperChimney1.jpg";
imageLoader.DisplayImage(path, imageView);

Related

How do i download multiple images on android from localhost server?

I created an android application to download images from my local server, but i failed to do it. I tried few times but i did not work out. Here is my source code at the exact class i created to do the function i want:
ArrayList<Bitmap> bitmapArray = new ArrayList<Bitmap>(4);
public static final String URL = "http://localhost/img/";
Button load_img;
ImageView imageview;
Bitmap bitmap;
ProgressDialog pDialog;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_monitor);
load_img = (Button)findViewById(R.id.load);
imageview = (ImageView)findViewById(R.id.img);
load_img.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new LoadImage().execute(new String[]{URL});
//img.setImageBitmap(bitmapArray.ge);
}
});
}
private class LoadImage extends AsyncTask<String, Void, Bitmap> {
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Monitor.this);
pDialog.setMessage("Fetching Images ....");
pDialog.show();
}
protected Bitmap doInBackground(String... urls) {
bitmap = null;
for(String url : urls){
bitmap = downloadImage(url);
}
//List<Bitmap> bitmap = new ArrayList<Bitmap>;
// bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());
return bitmap;
}
private Bitmap downloadImage(String arg0){
bitmap = null;
InputStream stream = null;
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
try{
stream = getHttpConnection(arg0);
bitmap = BitmapFactory.decodeStream(stream, null,bmOptions);
stream.close();
}catch(Exception e){
e.printStackTrace();
}
bitmapArray.add(bitmap);
return bitmap;
}
protected void onPostExecute(Bitmap result) {
if(result != null){
imageview.setImageBitmap(bitmap);
pDialog.dismiss();
}else{
pDialog.dismiss();
Toast.makeText(Monitor.this,"Failed in downloading the image", Toast.LENGTH_SHORT).show();
}
}
//creating open connection
private InputStream getHttpConnection(String urlString) throws IOException{
InputStream stream = null;
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
try {
HttpURLConnection httpConnection = (HttpURLConnection) connection;
httpConnection.setRequestMethod("GET");
httpConnection.connect();
if(httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
stream = httpConnection.getInputStream();
}
}catch(Exception e){
e.printStackTrace();
}
return stream;
}
}
}

NullPointerException on ImageView inside Adapter

I am using ViewPager to hold my Fragments. I have two Fragments with different Parse Queries. One of My Fragment has grid view layout. I have created and Adapter for the GridView to load images.
This is my fragment
public class FeedsFragment extends Fragment {
GridView gridview;
List<ParseObject> ob;
FeedsGridAdapter adapter;
private List<ParseFeeds> phonearraylist = null;
View rootView;
public static final String TAG = FeedsFragment.class.getSimpleName();
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.feeds_layout,
container, false);
new RemoteDataTask().execute();
return rootView;
}
private class RemoteDataTask extends AsyncTask<Void,Void,Void> {
#Override
protected void onPreExecute() {
super.onPreExecute();
}
#Override
protected Void doInBackground(Void... params) {
// Create the array
phonearraylist = new ArrayList<ParseFeeds>();
try {
// Locate the class table named "SamsungPhones" in Parse.com
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
"AroundMe");
// Locate the column named "position" in Parse.com and order list
// by ascending
// query.whereEqualTo(ParseConstants.KEY_RECIPIENT_IDS, ParseUser.getCurrentUser().getUsername());
query.orderByAscending("createdAt");
ob = query.find();
for (ParseObject country : ob) {
ParseFile image = (ParseFile) country.get("videoThumbs");
ParseFeeds map = new ParseFeeds();
map.setPhone(image.getUrl());
phonearraylist.add(map);
}
} catch (ParseException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void result) {
// Locate the gridview in gridview_main.xml
gridview = (GridView) rootView.findViewById(R.id.gridview);
// Pass the results into ListViewAdapter.java
adapter = new FeedsGridAdapter(FeedsFragment.this.getActivity(),
phonearraylist);
// Binds the Adapter to the ListView
gridview.setAdapter(adapter);
}
}
}
The Adapter I created to load the images into
public static final String TAG = FeedsGridAdapter.class.getSimpleName();
// Declare Variables
Context context;
LayoutInflater inflater;
ImageLoader imageLoader;
private List<ParseFeeds> phonearraylist = null;
private ArrayList<ParseFeeds> arraylist;
public FeedsGridAdapter(Context context, List<ParseFeeds> phonearraylist) {
this.context = context;
this.phonearraylist = phonearraylist;
inflater = LayoutInflater.from(context);
this.arraylist = new ArrayList<ParseFeeds>();
this.arraylist.addAll(phonearraylist);
imageLoader = new ImageLoader(context);
}
public class ViewHolder {
ImageView phone;
}
#Override
public int getCount() {
return phonearraylist.size();
}
#Override
public Object getItem(int position) {
return phonearraylist.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.feeds_layout, null);
// Locate the ImageView in gridview_item.xml
holder.phone = (ImageView) view.findViewById(R.id.videoThumb);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
// Load image into GridView
imageLoader.DisplayImage(phonearraylist.get(position).getPhone(),
holder.phone);
// Capture GridView item click
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// Send single item click data to SingleItemView Class
Intent intent = new Intent(context, SingleVideoView.class);
// Pass all data phone
intent.putExtra("phone", phonearraylist.get(position)
.getPhone());
context.startActivity(intent);
}
});
return view;
}
}
Here its giving me NullPointerException on imageLoader.DisplayImage(phonearraylist.get(position).getPhone(),
holder.phone);
When I run the same code in another project with only one Fragment its working but when I use it in my current project with Two Fargments having different parse queries it gives me NullPointerException.Please help I wasted around 5 days on this to get it working tried everything possible at my end.
Here is my ImageLoader Class
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
}
// int stub_id = ;
public void DisplayImage(String url, ImageView imageView) {
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null)
imageView.setImageBitmap(bitmap);
else {
queuePhoto(url, imageView);
imageView.setImageResource(R.drawable.camera_iris);
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null)
return b;
// Download Images from the Internet
try {
Bitmap bitmap = null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if (ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
// Decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 100;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
#Override
public void run() {
try {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
} catch (Throwable th) {
th.printStackTrace();
}
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null)
photoToLoad.imageView.setImageBitmap(bitmap);
else
photoToLoad.imageView.setImageResource(R.drawable.camera_iris);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
There is a NullPointerException imageLoader.DisplayImage(phonearraylist.get(position).getPhone(), holder.phone);
Which leads to a suspiciously null (ImageView) holder.phone.
Why it must be null ?
Because it might not be lying inside the view you inflated to.
So
You should check if you are inflating a proper layout from resource and not making any of the most common mistakes like using activity/fragment's layout resource instead of using adapter's item layout.
You're welcome.
ImageLoader Initialize like below way
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheOnDisc()//.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565).build();
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(
this).defaultDisplayImageOptions(defaultOptions).memoryCache(
new WeakMemoryCache());
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
ImageLoaderConfiguration config = builder.build();
imageLoader = ImageLoader.getInstance();
imageLoader.init(config);

Create new activity from ImageButton in ListView

Im beginner and try to work on an app. I want to create a new page/activity when the imageButton on the listView is clicked. (The image is grab from url). Any help is appreciated.
Here is themain.java
public class IngredientCategoryMain extends Activity {
ListView list;
String[] title;
CategoryImageAdapter adapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ingredient_category_main);
list=(ListView)findViewById(R.id.listView);
title = getResources().getStringArray(R.array.titles);
adapter=new CategoryImageAdapter(this, mStrings, title);
list.setAdapter(adapter);
}
#Override
public void onDestroy() {
list.setAdapter(null);
super.onDestroy();
}
public View.OnClickListener listener=new View.OnClickListener() {
#Override
public void onClick(View arg0) {
adapter.imageLoader.clearCache();
adapter.notifyDataSetChanged();
}
};
public void onItemClick(int mPosition) {
String tempValues = title[mPosition];
Toast.makeText(IngredientCategoryMain.this, "You have clicked "+tempValues, Toast.LENGTH_LONG).show();
}
private String[] mStrings={
"https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Ic_cake_48px.svg/2000px-Ic_cake_48px.svg.png",
"https://pixabay.com/static/uploads/photo/2013/04/01/21/30/can-99137_960_720.png",
"http://publicdomainvectors.org/photos/Gerald_G_Fast_Food_Drinks_(FF_Menu)_9.png",
"https://pixabay.com/static/uploads/photo/2014/03/25/16/59/apple-297775_960_720.png",
"https://pixabay.com/static/uploads/photo/2012/04/16/11/14/mortar-35544_960_720.png",
"https://pixabay.com/static/uploads/photo/2013/07/13/10/05/cattle-156498_960_720.png",
"https://pixabay.com/static/uploads/photo/2013/07/12/15/39/acorn-150258_960_720.png",
"http://publicdomainvectors.org/photos/johnny_automatic_bread_with_knife.png",
"https://pixabay.com/static/uploads/photo/2015/09/13/00/12/chicken-937584_960_720.jpg",
"http://publicdomainvectors.org/photos/bowl-of-steaming-soup-01.png",
"https://pixabay.com/static/uploads/photo/2014/04/02/10/38/fish-304097_960_720.png",
"http://publicdomainvectors.org/photos/Erbsen-lineart.png"
};
}
Adapter
public class CategoryImageAdapter extends BaseAdapter implements OnClickListener {
private Activity activity;
private String[] data;
private String[] title;
private static LayoutInflater inflater = null;
public ImageLoader imageLoader;
public CategoryImageAdapter(Activity a, String[] d, String[] t) {
activity = a;
title = t;
data = d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new ImageLoader(activity.getApplicationContext());
}
#Override
public int getCount() {
return title.length;
}
#Override
public Object getItem(int position) {
return position;
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public void onClick(View v) {
}
public static class ViewHolder {
public ImageButton imageButton;
public TextView textView;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
ViewHolder holder;
if (convertView == null) {
vi = inflater.inflate(R.layout.ingcategoryrow, null);
holder = new ViewHolder();
holder.textView = (TextView) vi.findViewById(R.id.textView2);
holder.imageButton = (ImageButton) vi.findViewById(R.id.imageButton2);
vi.setTag(holder);
} else
holder = (ViewHolder) vi.getTag();
holder.textView.setText(title[position]);
ImageButton imageButton = holder.imageButton;
imageLoader.DisplayImage(data[position], imageButton);
vi.setOnClickListener(new OnItemClickListener(position));
return vi;
}
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position) {
mPosition = position;
}
#Override
public void onClick(View arg0) {
IngredientCategoryMain sct = (IngredientCategoryMain)activity;
sct.onItemClick(mPosition);
}
}
ImageLoader
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageButton, String> imageButtons = Collections.synchronizedMap(new WeakHashMap<ImageButton, String>());
ExecutorService executorService;
Handler handler = new Handler();
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService= Executors.newFixedThreadPool(5);
}
final int stub_id=R.drawable.bakingood;
public void DisplayImage(String url, ImageButton imageButton) {
imageButtons.put(imageButton, url);
Bitmap bitmap = memoryCache.get(url);
if(bitmap!=null) {
imageButton.setImageBitmap(bitmap);
} else {
queuePhoto(url, imageButton);
imageButton.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageButton imageButton){
PhotoToLoad p = new PhotoToLoad(url, imageButton);
executorService.submit(new PhotosLoader(p));
}
private class PhotoToLoad {
public String url;
public ImageButton imageButton;
public PhotoToLoad(String u, ImageButton i) {
url=u;
imageButton=i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad=photoToLoad;
}
#Override
public void run() {
try{
if(imageButtonReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageButtonReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
} catch (Throwable th) {
th.printStackTrace();
}
}
}
private Bitmap getBitmap(String url) {
File f=fileCache.getFile(url);
Bitmap b= decodeFile(f);
if(b!=null)
return b;
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if(ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
private Bitmap decodeFile(File f) {
try {
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1=new FileInputStream(f);
BitmapFactory.decodeStream(stream1,null,o);
stream1.close();
//Find the correct scale value. It should be the power of 2.
// Set width/height of recreated image
final int REQUIRED_SIZE=85;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//decode with current scale values
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
FileInputStream stream2=new FileInputStream(f);
Bitmap bitmap= BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
boolean imageButtonReused(PhotoToLoad photoToLoad){
String tag=imageButtons.get(photoToLoad.imageButton);
if (tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {bitmap = b;photoToLoad = p;}
public void run() {
if (imageButtonReused(photoToLoad))
return;
if (bitmap!=null)
photoToLoad.imageButton.setImageBitmap(bitmap);
else
photoToLoad.imageButton.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
MemoryCache
public class MemoryCache {
private static final String TAG = "MemoryCache";
private Map<String, Bitmap> cache = Collections.synchronizedMap(
new LinkedHashMap<String, Bitmap>(10,1.5f, true));
private long size=0;
private long limit=1000000;
public MemoryCache () {
setLimit(Runtime.getRuntime().maxMemory() / 4);
}
public void setLimit(long limit) {
this.limit = limit;
Log.i(TAG, "MemoryCache will use up to " + limit / 1024. / 1024. + "MB");
}
public Bitmap get(String id) {
try {
if (!cache.containsKey(id))
return null;
return cache.get(id);
} catch (NullPointerException ex) {
ex.printStackTrace();
return null;
}
}
public void put(String id, Bitmap bitmap) {
try{
if(cache.containsKey(id))
size-=getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size+=getSizeInBytes(bitmap);
checkSize();
}catch (Throwable th) {
th.printStackTrace();
}
}
private void checkSize() {
Log.i(TAG, "cache size="+size+" length="+cache.size());
if(size>limit) {
Iterator<Map.Entry<String, Bitmap>> iter=cache.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Bitmap> entry=iter.next();
size-=getSizeInBytes(entry.getValue());
iter.remove();
if(size<=limit)
break;
}
Log.i(TAG, "Clean cache.New size "+cache.size());
}
}
public void clear() {
try{
cache.clear();
size=0;
}catch (NullPointerException ex) {
}
}
private long getSizeInBytes(Bitmap bitmap) {
if (bitmap==null)
return 0;
return bitmap.getRowBytes()*bitmap.getHeight();
}
}
FileCache
public class FileCache {
private File cacheDir;
public FileCache(Context context) {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
{
//if SDCARD is mounted (SDCARD is present on device and mounted)
cacheDir = new File(
android.os.Environment.getExternalStorageDirectory(),"LazyList");
}
else
{
// if checking on simulator the create cache dir in your application context
cacheDir=context.getCacheDir();
}
if(!cacheDir.exists()){
// create cache dir in your application context
cacheDir.mkdirs();
}
}
public void clear() {
File[] files=cacheDir.listFiles();
if(files==null)
return;
for (File f:files)
f.delete();
}
public File getFile(String url) {
//Identify images by hashcode or encode by URLEncoder.encode.
String filename=String.valueOf(url.hashCode());
File f = new File(cacheDir, filename);
return f;
}
}
Utils
public class Utils {
public static void CopyStream(InputStream is, OutputStream os)
{
final int buffer_size=1024;
try {
byte[] bytes=new byte[buffer_size];
for(;;) {
int count = is.read(bytes, 0, buffer_size);
if (count == -1)
break;
os.write(bytes, 0, count);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
In your adapter, after this line:
ImageButton imageButton = holder.imageButton;
do something like this:
imageButton.setOnClickListener(new.View.OnClickListener(){
#Override
Public void onClick(View :)
{
Intent intent = New intent(activity, ExampleActivityName.class);
activity.startActivity(intent);
}
});
The way it works is that every view has an option to react to click events that the user performs ”on him”, all you need to do is to pass an implementation of the View.OnClickListener Interface to the View (via the setOnClickListener method) and that's it.
Second step is to start an activity which is faily easy, you need to create an intent with the current context and the class of the activity you wish to start, and than call the startActivity method from your current context.
In this case, the current context is represented by the activity reference.
add the code of 'startActivity(intent)' in your listitem.onclick - you can check which image is being clicked or also the position and then launch the appropriate activity.
after this line
ImageButton imageButton = holder.imageButton;
just add this lines of code
imageButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
activity.startActivity(new Intent(activity, YourActivityClass.class));
}
});

Migrating from AndroidHttpClient to URLConnection

I'm relatively new to this and I've been using the AndroidHttpClient just fine to help with downloading images to my app via Parse. Now with Sdk 23, I've got to rewrite a few of my classes. My question is fairly simple.
Let's take the following code, which doesn't do anything as an example:
new TwinPrimeSDK(getApplicationContext(), "12345678-1234-1234-1234-123456789012-1234567-123");
try {
URLConnection httpConn = TPURLConnection.openConnection("your-URL");
} catch (IOException e) {
e.printStackTrace();
}
What does the "your-URL" refer to? With AndroidHttpClient over Apache I never had to use a specific URL for anything. It just worked.
Update:
public class ImageLoader {
// Last argument true for LRU ordering
private Map<String, String> objectIdToUriMap = Collections.synchronizedMap(new LinkedHashMap<String, String>(10, 1.5f, true));
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(FileCache fileCache) {
//fileCache = new FileCache(context);
this.fileCache = fileCache;
executorService = Executors.newFixedThreadPool(5);
// need to re-evaluate where to do this as it is causing problems with not being able to download feed items as they are cleared from cache
//clearCache();
// only clear file cache, we're not using mem cache (every time we instantiate with a filecache)
fileCache.clear();
}
public void DisplayImage(String url, ImageView imageView, ProgressBar progress) {
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}
else {
queuePhoto(url, imageView, progress);
//imageView.setImageResource(stub_id);
imageView.setVisibility(View.GONE);
if(progress != null) {
progress.setVisibility(View.VISIBLE);
}
}
}
private void queuePhoto(String url, ImageView imageView, ProgressBar progress) {
PhotoToLoad p = new PhotoToLoad(url, imageView, progress);
executorService.submit(new PhotosLoader(p));
}
// must be run in a thread
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null) {
return b;
}
// Download Images from the Internet
try {
Bitmap bitmap = null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
FeedUtils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if (ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
public Uri getImageURIWithDownload(String url) {
// try getting file from cache 1st
File f = fileCache.getFile(url);
if (f != null) {
if(f.exists()) {
return Uri.fromFile(f);
}
}
// get bitmap from http (or cache, in fact)
getBitmap(url);
// try getting file again
f = fileCache.getFile(url);
return (f != null) ? Uri.fromFile(f) : null;
}
// Decodes image and scales it to reduce memory consumption
// note. wda. doesn't use sample size (no scaling!)
private Bitmap decodeFile(File f) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
//o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public ProgressBar progress;
public PhotoToLoad(String u, ImageView i, ProgressBar p) {
url = u;
imageView = i;
progress = p;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
#Override
public void run() {
try {
if (imageViewReused(photoToLoad)) { return; }
Bitmap bmp = getBitmap(photoToLoad.url);
//memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad)) { return; }
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
handler.post(bd);
} catch (Throwable th) {
th.printStackTrace();
}
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url)) {
return true;
}
return false;
}
// Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
photoToLoad = p;
}
public void run() {
if (imageViewReused(photoToLoad)) { return; }
if (bitmap != null) {
photoToLoad.imageView.setImageBitmap(bitmap);
photoToLoad.imageView.setVisibility(View.VISIBLE);
if(photoToLoad.progress != null)
photoToLoad.progress.setVisibility(View.GONE);
}
else {}
//photoToLoad.imageView.setImageResource(stub_id);
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
What does the "your-URL" refer to?
It refers to the url which you want to access information from.
With AndroidHttpClient over Apache I never had to use a specific URL for anything. It just worked.
No you'll provide url in that case too.
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(URL));
If you want to use a http request, it should have a request url, without which it doesn't know where to get data from.

SingleView ImageLoader Display NullPointerException

I am new to Android development and Java in general. I realize that this question may seem quite elementary, but I am just not understanding despite looking on numerous forums, reading about the exception and debugging my activity.
I am trying to parse JSON image data into a GridView.
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class JSONImageViewer extends Activity {
JSONObject jsonobject;
JSONArray jsonarray;
ListViewAdapter adapter;
ProgressDialog mProgressDialog;
ArrayList<HashMap<String, String>> arraylist;
static String TAG_IMG = "CarImageLink";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get the view from gridview_item.xml
setContentView(R.layout.gridview_item);
// Execute DownloadJSON AsyncTask
new DownloadJSON().execute();
}
// DownloadJSON AsyncTask
private class DownloadJSON extends AsyncTask<Void, Void, Void> {
#Override
protected void onPreExecute() {
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(JSONImageViewer.this);
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
}
#Override
protected Void doInBackground(Void... params) {
//Create an array
arraylist = new ArrayList<HashMap<String, String>>();
//Retrieve JSON Objects from the given URL address
jsonobject = JSONfunctions
.getJSONfromURL("......");
try {
//Locate the array name in JSON
jsonarray = jsonobject.getJSONArray("car_images");
for (int i = 0; i < jsonarray.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
jsonobject = jsonarray.getJSONObject(i);
//Retrieve JSON Object
map.put("CarImageLink", jsonobject.getString("CarImageLink"));
//Set the JSON Objects into the array
arraylist.add(map);
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void args) {
//Locate the Gridview in gridview_main.xml
GridView gridview;
gridview = (GridView) findViewById(R.id.gridview);
adapter = new ListViewAdapter(JSONImageViewer.this, arraylist);
//Set the adapter to the GridView
gridview.setAdapter(adapter);
//Close the progressdialog
mProgressDialog.dismiss();
}
}
public static class JSONfunctions {
public static JSONObject getJSONfromURL(String url) {
InputStream is = null;
String result = "";
JSONObject jArray = null;
//Download JSON data from URL
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
//Convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
try {
jArray = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return jArray;
}
}
public class ListViewAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
ImageLoader imageLoader;
HashMap<String, String> resultp = new HashMap<String, String>();
public ListViewAdapter(Context context, ArrayList<HashMap<String, String>> arraylist) {
this.context = context;
data = arraylist;
imageLoader = new ImageLoader(context);
}
#Override
public int getCount() {
return data.size();
}
#Override
public Object getItem(int position) {
return null;
}
#Override
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ImageView carimg;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.gridview_item, parent, false);
//Get the position
resultp = data.get(position);
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink"));
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink))"));
Log.v("resultp", resultp.toString());
//Locate the ImageView in gridview_item.xml
carimg = (ImageView) itemView.findViewById(R.id.car_img);
//Capture position and set results to the ImageView
//Passes images URL into ImageLoader.class
int loader = R.drawable.temp_img;
int stub_id = loader;
imageLoader.DisplayImage(resultp.get(JSONImageViewer.TAG_IMG),stub_id, carimg);
Log.v("resultp e1", (resultp.get(TAG_IMG).toString()));
//Log.v("carimg", carimg.toString());
Log.v("resultp e2", resultp.toString());
//Capture ListView item click
itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
//Get the position
resultp = data.get(position);
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink"));
Intent intent = new Intent(context, SingleItemView.class);
// Pass all data
intent.putExtra("CarImageLink", resultp.get(JSONImageViewer.TAG_IMG));
//Start SingleItemView Class
context.startActivity(intent);
}
});
return itemView;
}
}
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
int stub_id = R.drawable.temp_img;
public void DisplayImage(String url, int loader, ImageView imageView)
{
try {
stub_id = loader;
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
if(bitmap!=null) {
imageView.setImageBitmap(bitmap);
Log.v("Bitmap 3", bitmap.toString());
}
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null) {
Log.v("bitmap 4", b.toString());
return b;
}
//Download Images from the Internet
try {
Bitmap bitmap;
// Log.v("Bitmap 5", bitmap.toString());
Uri.Builder uri = Uri.parse("....").buildUpon();
uri.appendPath(url);
uri.build();
Log.v("Build", uri.build().toString());
Log.v("Uri", uri.toString());
URL imageUrl = new URL ("http://"+ "....com" + url);
Log.v("URL 3", imageUrl.toString());
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
//Log.v("bitmap 6", bitmap.toString());
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if (ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
//Decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
Log.v("bitmap 7", bitmap.toString());
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
#Override
public void run() {
try {
//if (imageViewReused(photoToLoad))
// return;
Bitmap bmp = getBitmap(photoToLoad.url);
Log.v("URL 2", photoToLoad.url.toString());
Log.v("Bitmap bmp", bmp.toString());
memoryCache.put(photoToLoad.url, bmp);
//if (imageViewReused(photoToLoad))
//return;
//BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
//handler.post(bd);
//Log.v("bd", bd.toString());
} catch (Throwable th) {
th.printStackTrace();
}
}
}
/* boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
*/
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap=b;
Log.v("bitmap b", b.toString());
photoToLoad=p;
}
public void run(){
// if(imageViewReused(photoToLoad)) {
//Log.v("BITMAP", bitmap.toString());
// return;
//}
Log.v("BITMAP", bitmap.toString());
if(bitmap != null) {
photoToLoad.imageView.setImageBitmap(bitmap);
Log.v("bitmap 2", bitmap.toString());
}
else {
photoToLoad.imageView.setImageResource(stub_id);
}
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
public class MemoryCache {
private static final String TAG = "MemoryCache";
//Last argument true for LRU ordering
private Map<String, Bitmap> cache = Collections
.synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true));
//Current allocated size
private long size = 0;
//Max memory in bytes
private long limit = 1000000;
public MemoryCache() {
//Use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory() / 4);
}
public void setLimit(long new_limit) {
limit = new_limit;
}
public Bitmap get(String id) {
try {
if (!cache.containsKey(id))
return null;
return cache.get(id);
} catch (NullPointerException ex) {
ex.printStackTrace();
return null;
}
}
public void put(String id, Bitmap bitmap) {
try {
if (cache.containsKey(id))
size -= getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size += getSizeInBytes(bitmap);
checkSize();
} catch (Throwable th) {
th.printStackTrace();
}
}
private void checkSize() {
Log.i(TAG, "cache size=" + size + " length=" + cache.size());
if (size > limit) {
//Least recently accessed item will be the first one iterated
Iterator<Map.Entry<String, Bitmap>> iter = cache.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Bitmap> entry = iter.next();
size -= getSizeInBytes(entry.getValue());
iter.remove();
if (size <= limit)
break;
}
Log.i(TAG, "Clean cache. New size " + cache.size());
}
}
public void clear() {
try {
cache.clear();
size = 0;
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
long getSizeInBytes(Bitmap bitmap) {
if (bitmap == null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}
public class FileCache {
private File cacheDir;
public FileCache(Context context) {
//Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(
android.os.Environment.getExternalStorageDirectory(),
"");
else
cacheDir = context.getCacheDir();
if (!cacheDir.exists())
cacheDir.mkdirs();
}
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
//String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
public void clear() {
File[] files = cacheDir.listFiles();
if (files == null)
return;
for (File f : files)
f.delete();
}
}
public static class Utils {
public static void CopyStream(InputStream is, OutputStream os)
{
final int buffer_size=1024;
try
{
byte[] bytes=new byte[buffer_size];
for(;;)
{
int count=is.read(bytes, 0, buffer_size);
if(count==-1)
break;
os.write(bytes, 0, count);
}
}
catch(Exception ex){}
}
}
public class SingleItemView extends Activity {
String carimg;
ImageLoader imageLoader = new ImageLoader(this);
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get the view from singleitemview.xml
setContentView(R.layout.singleitemview);
Intent i = getIntent();
//Get the result of CarImageLink
carimg = i.getStringExtra("CarImageLink");
Log.v("carimg", i.getStringExtra("CarImageLink").toString());
int loader = R.drawable.temp_img;
int stub_id = loader;
//Locate the ImageView in singleitemview.xml
ImageView img_car = (ImageView) findViewById(R.id.car_img);
Log.v("Imageview img_car", img_car.toString());
//Capture position and set results to the ImageView
//Passes carimg images URL into ImageLoader.class
imageLoader.DisplayImage(carimg, stub_id, img_car);
}
}
griview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<GridView
android:id="#+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/cars"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/car_id"
android:text="#string/id"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/car_vin"
android:layout_below="#id/car_id"
android:text="#string/vin"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/model_img"
android:layout_toRightOf="#id/car_id"/>
<ListView
android:id="#+id/list"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
</LinearLayout>
singleitemview.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="#+id/car_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="#000000"
android:padding="1dp"
android:src="#drawable/temp_img" />
</RelativeLayout>
Any suggestions as to how to solve these errors would be greatly appreciated. Thank you.
Update:
java.lang.NullPointerException
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at com.example.justin.myapplication.JSONImageViewer$ImageLoader.DisplayImage(JSONImageViewer.java:290)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at com.example.justin.myapplication.JSONImageViewer$ListViewAdapter.getView(JSONImageViewer.java:229)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.AbsListView.obtainView(AbsListView.java:2143)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.GridView.makeAndAddView(GridView.java:1341)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.GridView.makeRow(GridView.java:341)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.GridView.fillDown(GridView.java:283)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.GridView.fillFromTop(GridView.java:417)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.GridView.layoutChildren(GridView.java:1229)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.AbsListView.onLayout(AbsListView.java:1994)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.view.View.layout(View.java:14008)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.view.View.layout(View.java:14008)
07-30 15:30:54.609 29426-29426/com.example.justin.myapplication W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4373)
imageView.setImageResource(stub_id); for (JSONImageViewer.java:290)
imageLoader.DisplayImage(resultp.get(JSONImageViewer.TAG_IMG),stub_id, carimg); for (JSONImageViewer.java:229)
Straightforward debugging stuff in Android.
Faced with a seemingly impenetrable Exception stack trace, the trick is scan down the list of routines looking for the first occurrence of a line of source in YOUR code. Set a breakpoint on that line, and take a look at what's actually happening. You should also look for "Caused by" inner exceptions when doing this. When there's an inner exception, you will find the problem in the stack trace for the inner except.
In your case the line of interest is the very first line in the stack trace:
at com.example.justin.myapplication.JSONImageViewer$ImageLoader.DisplayImage(JSONImageViewer.java:287)
A Null pointer exception occured in JSONImageViewer.java at line 287.
Set a breakpoint on that line in the debugger, and look to see what's happening. You can just double-click on the file and line-number in the stack trace to go straight to the source line.
I can't tell which line is line 287. But it seems to be something to do with the URL you're constructing. You should be able to figure this out pretty easily once you set a breakpoint on line 287.
I believe that the issue is due to the hashmap.
A hashmap is made of key and value. However, you are not saving a key to the value specified. ("resultp = data.get(position);").
Therefore, when you try to access a value of the hashmap with the key : "TAG_IMG", the app is crashing with null pointer because this will return a null value.
The correct way of fixing this issue would be : resultp.put(TAG_IMG, data.get(position));
public class JSONImageViewer extends Activity {
JSONObject jsonobject;
JSONArray jsonarray;
ListViewAdapter adapter;
ProgressDialog mProgressDialog;
ArrayList<HashMap<String, String>> arraylist;
static String TAG_IMG = "CarImageLink";
GridView gridview;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridview = (GridView) findViewById(R.id.gridview);
new DownloadJSON().execute();
}
// DownloadJSON AsyncTask
private class DownloadJSON extends AsyncTask<Void, Void, Void> {
#Override
protected void onPreExecute() {
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(JSONImageViewer.this);
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
}
#Override
protected Void doInBackground(Void... params) {
//Create an array
arraylist = new ArrayList<HashMap<String, String>>();
//Retrieve JSON Objects from the given URL address
jsonobject = JSONfunctions
.getJSONfromURL("......");
try {
//Locate the array name in JSON
jsonarray = jsonobject.getJSONArray("car_images");
HashMap<String, String> map = new HashMap<String, String>();
for (int i = 0; i < jsonarray.length(); i++) {
jsonobject = jsonarray.getJSONObject(i);
//Retrieve JSON Object
map.put("CarImageLink" + i, jsonobject.getString("CarImageLink"));
//Set the JSON Objects into the array
arraylist.add(map);
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void args) {
if (arraylist != null && arraylist.size() > 0) {
adapter = new ListViewAdapter(getApplicationContext(), arraylist);
//Set the adapter to the GridView
gridview.setAdapter(adapter);
} else Toast.makeText(getApplicationContext(), "List is null", Toast.LENGTH_SHORT);
//Close the progressdialog
mProgressDialog.dismiss();
}
}
public static class JSONfunctions {
public static JSONObject getJSONfromURL(String url) {
InputStream is = null;
String result = "";
JSONObject jArray = null;
//Download JSON data from URL
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
//Convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
try {
jArray = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return jArray;
}
}
public class ListViewAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
ImageLoader imageLoader;
HashMap<String, String> resultp = new HashMap<String, String>();
public ListViewAdapter(Context context, ArrayList<HashMap<String, String>> arraylist) {
this.context = context;
this.data = arraylist;
imageLoader = new ImageLoader(context);
}
#Override
public int getCount() {
return data.size();
}
#Override
public Object getItem(int position) {
return null;
}
#Override
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ImageView carimg;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.gridview_item, parent, false);
//Get the position
resultp = data.get(position);
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink"));
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink))"));
Log.v("resultp", resultp.toString());
//Locate the ImageView in gridview_item.xml
carimg = (ImageView) itemView.findViewById(R.id.car_img);
//Capture position and set results to the ImageView
//Passes images URL into ImageLoader.class
int loader = R.drawable.temp_img;
int stub_id = loader;
if (carimg == null) {
Toast.makeText(getApplicationContext(), "A crash is going to happen due to error in xml", Toast.LENGTH_SHORT);
}
if (resultp.get(TAG_IMG) == null) {
Toast.makeText(getApplicationContext(), "A crash is going to happen due to hashma error", Toast.LENGTH_SHORT).show();
}
imageLoader.DisplayImage(resultp.get(TAG_IMG) + position, stub_id, carimg);
Log.v("resultp e1", (resultp.get(TAG_IMG).toString()));
//Log.v("carimg", carimg.toString());
Log.v("resultp e2", resultp.toString());
//Capture ListView item click
/*itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
//Get the position
resultp = data.get(position);
//resultp.put(TAG_IMG,data.get(position).get("CarImageLink"));
Intent intent = new Intent(context, SingleItemView.class);
// Pass all data
intent.putExtra("CarImageLink", resultp.get(JSONImageViewer.TAG_IMG));
//Start SingleItemView Class
context.startActivity(intent);
}
});*/
return itemView;
}
}
public class ImageLoader {
MemoryCache memoryCache = new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
// Handler to display images in UI thread
Handler handler = new Handler();
public ImageLoader(Context context) {
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
}
int stub_id = R.drawable.temp_img;
public void DisplayImage(String url, int loader, ImageView imageView) {
try {
stub_id = loader;
imageViews.put(imageView, url);
Bitmap bitmap = memoryCache.get(url);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
Log.v("Bitmap 3", bitmap.toString());
} else {
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url) {
File f = fileCache.getFile(url);
Bitmap b = decodeFile(f);
if (b != null) {
Log.v("bitmap 4", b.toString());
return b;
}
//Download Images from the Internet
try {
Bitmap bitmap;
// Log.v("Bitmap 5", bitmap.toString());
Uri.Builder uri = Uri.parse("....").buildUpon();
uri.appendPath(url);
uri.build();
Log.v("Build", uri.build().toString());
Log.v("Uri", uri.toString());
URL imageUrl = new URL("http://" + "....com" + url);
Log.v("URL 3", imageUrl.toString());
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
conn.disconnect();
bitmap = decodeFile(f);
//Log.v("bitmap 6", bitmap.toString());
return bitmap;
} catch (Throwable ex) {
ex.printStackTrace();
if (ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
//Decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
Log.v("bitmap 7", bitmap.toString());
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
#Override
public void run() {
try {
//if (imageViewReused(photoToLoad))
// return;
Bitmap bmp = getBitmap(photoToLoad.url);
Log.v("URL 2", photoToLoad.url.toString());
Log.v("Bitmap bmp", bmp.toString());
memoryCache.put(photoToLoad.url, bmp);
//if (imageViewReused(photoToLoad))
//return;
//BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
//handler.post(bd);
//Log.v("bd", bd.toString());
} catch (Throwable th) {
th.printStackTrace();
}
}
}
/* boolean imageViewReused(PhotoToLoad photoToLoad) {
String tag = imageViews.get(photoToLoad.imageView);
if (tag == null || !tag.equals(photoToLoad.url))
return true;
return false;
}
*/
class BitmapDisplayer implements Runnable {
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
bitmap = b;
Log.v("bitmap b", b.toString());
photoToLoad = p;
}
public void run() {
// if(imageViewReused(photoToLoad)) {
//Log.v("BITMAP", bitmap.toString());
// return;
//}
Log.v("BITMAP", bitmap.toString());
if (bitmap != null) {
photoToLoad.imageView.setImageBitmap(bitmap);
Log.v("bitmap 2", bitmap.toString());
} else {
photoToLoad.imageView.setImageResource(stub_id);
}
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
public class MemoryCache {
private static final String TAG = "MemoryCache";
//Last argument true for LRU ordering
private Map<String, Bitmap> cache = Collections
.synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true));
//Current allocated size
private long size = 0;
//Max memory in bytes
private long limit = 1000000;
public MemoryCache() {
//Use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory() / 4);
}
public void setLimit(long new_limit) {
limit = new_limit;
}
public Bitmap get(String id) {
try {
if (!cache.containsKey(id))
return null;
return cache.get(id);
} catch (NullPointerException ex) {
ex.printStackTrace();
return null;
}
}
public void put(String id, Bitmap bitmap) {
try {
if (cache.containsKey(id))
size -= getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size += getSizeInBytes(bitmap);
checkSize();
} catch (Throwable th) {
th.printStackTrace();
}
}
private void checkSize() {
Log.i(TAG, "cache size=" + size + " length=" + cache.size());
if (size > limit) {
//Least recently accessed item will be the first one iterated
Iterator<Map.Entry<String, Bitmap>> iter = cache.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Bitmap> entry = iter.next();
size -= getSizeInBytes(entry.getValue());
iter.remove();
if (size <= limit)
break;
}
Log.i(TAG, "Clean cache. New size " + cache.size());
}
}
public void clear() {
try {
cache.clear();
size = 0;
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
long getSizeInBytes(Bitmap bitmap) {
if (bitmap == null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}
public class FileCache {
private File cacheDir;
public FileCache(Context context) {
//Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(
android.os.Environment.getExternalStorageDirectory(),
"");
else
cacheDir = context.getCacheDir();
if (!cacheDir.exists())
cacheDir.mkdirs();
}
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
//String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
public void clear() {
File[] files = cacheDir.listFiles();
if (files == null)
return;
for (File f : files)
f.delete();
}
}
public static class Utils {
public static void CopyStream(InputStream is, OutputStream os) {
final int buffer_size = 1024;
try {
byte[] bytes = new byte[buffer_size];
for (; ; ) {
int count = is.read(bytes, 0, buffer_size);
if (count == -1)
break;
os.write(bytes, 0, count);
}
} catch (Exception ex) {
}
}
}
/* public class SingleItemView extends Activity {
String carimg;
ImageLoader imageLoader = new ImageLoader(this);
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get the view from singleitemview.xml
setContentView(R.layout.singleitemview);
Intent i = getIntent();
//Get the result of CarImageLink
carimg = i.getStringExtra("CarImageLink");
Log.v("carimg", i.getStringExtra("CarImageLink").toString());
int loader = R.drawable.temp_img;
int stub_id = loader;
//Locate the ImageView in singleitemview.xml
ImageView img_car = (ImageView) findViewById(R.id.car_img);
Log.v("Imageview img_car", img_car.toString());
//Capture position and set results to the ImageView
//Passes carimg images URL into ImageLoader.class
imageLoader.DisplayImage(carimg, stub_id, img_car);
}
}*/
}

Categories