2012-03-23 19 views
1

私はgridViewにURLを使用して画像をプルするアプリケーションを実行していますが、アプリケーションはエミュレータで正常に動作しますが、Logitechデバイスで実行すると画像は表示されません。代わりに、スタブのサムネイルだけが表示されます。Logitechデバイスに画像が表示されないのはなぜですか?

これはなぜ起こっているのですか?

public class ImageAdapter extends BaseAdapter { 

//intialize variables 

public ImageLoader imageLoader; 

Context mContext; 
private List<Video> myVideos; 

/* 
* Constructor 
* @params: Context 
* @params: XML url 
*/ 
public ImageAdapter(Context a,List<Video> myList){ 
    mContext = a; 
    myVideos = myList;   
    imageLoader=new ImageLoader(mContext); 
} 

/*s 
* (non-Javadoc) 
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) 
*/ 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ImageView view; 
    if (convertView == null) { 
     view= new ImageView(mContext); 
     view.setLayoutParams(new GridView.LayoutParams(150,150)); 
     view.setPadding(1, 1, 1, 1);    
    } 
    else{ 
     view = (ImageView)convertView; 
    } 
    Log.i("Assigning view",""); 
    imageLoader.DisplayImage(myVideos.get(position).getThumbNail(), view); 
    return view; 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getCount() 
*/ 
public int getCount() { 
    return myVideos.size(); 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getItem(int) 
*/ 
public String getItem(int position) { 
    return myVideos.get(position).toString(); 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getItemId(int) 
*/ 
public long getItemId(int position) { 
    return 0; 
} 

}

public class ImageLoader { 

MemoryCache memoryCache=new MemoryCache(); 
FileCache fileCache; 
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>()); 
ExecutorService executorService; 

public ImageLoader(Context context){ 
    fileCache=new FileCache(context); 
    executorService=Executors.newFixedThreadPool(5); 
} 

final int stub_id=R.drawable.stub; 
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); 

    //from SD cache 
    Bitmap b = decodeFile(f); 
    if(b!=null) 
     return b; 

    //from web 
    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(); 
     bitmap = decodeFile(f); 
     return bitmap; 
    } catch (Exception ex){ 
     ex.printStackTrace(); 
     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; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //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; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 
    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; 
    } 

    public void run() { 
     if(imageViewReused(photoToLoad)) 
      return; 
     Bitmap bmp=getBitmap(photoToLoad.url); 
     memoryCache.put(photoToLoad.url, bmp); 
     if(imageViewReused(photoToLoad)) 
      return; 
     BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad); 
     Activity a=(Activity)photoToLoad.imageView.getContext(); 
     a.runOnUiThread(bd); 
    } 
} 

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(); 
} 

}

public class MemoryCache { 

private static final String TAG = "MemoryCache"; 
private Map<String, Bitmap> cache=Collections.synchronizedMap(
     new LinkedHashMap<String, Bitmap>(10,1.5f,true));//Last argument true for LRU ordering 
private long size=0;//current allocated size 
private long limit=1000000;//max memory in bytes 

public MemoryCache(){ 
    //use 25% of available heap size 
    setLimit(Runtime.getRuntime().maxMemory()/4); 
} 

public void setLimit(long new_limit){ 
    limit=new_limit; 
    Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB"); 
} 

public Bitmap get(String id){ 
    if(!cache.containsKey(id)) 
     return null; 
    return cache.get(id); 
} 

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<Entry<String, Bitmap>> iter=cache.entrySet().iterator();//least recently accessed item will be the first one iterated 
     while(iter.hasNext()){ 
      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() { 
    cache.clear(); 
} 

long getSizeInBytes(Bitmap bitmap) { 
    if(bitmap==null) 
     return 0; 
    return bitmap.getRowBytes() * bitmap.getHeight(); 
} 

}

答えて

0

は問題が見つかりました:

は、ここに私のコードです。私のMemoryCacheクラスは、Logitechデバイス上に存在しなかった参照元と外部記憶装置でした

関連する問題