انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
اندروید: کلید 2777 (قرار دادن عکس از اینترنت بدون cache کردن)

اندروید: کلید 2777 (قرار دادن عکس از اینترنت بدون cache کردن)

#1
با سلام :
با استفاده ازکلید 2777 توانستم چند عکس که مسیر آنها را با جیسون می گرفتم در گریدویو قرار دهم .
می خوام برخلاف این آموزش عکس ها cache نشود !
چون عکسهای من متفاوت می باشد و هر بار جیسون و مسیری که دریافت می نمایم متفاوت می باشد بنابراین کش کردن عکس ها به صرفه نیست.
توی قطعه کدی که از کلاس memory cache گذاشتم زیاد دستکاری کردم که حداقل فضا برای کش کردن رو کم کنم اما نشد .

آیا می شود از این کلاس استفاده کرد بدون اینکه عکس ها رو کش کند . چون چند جا اومده بررسی کرده که اگر فایل نبود چه کارهایی رو انجام بده من نتونستم
و آیا می شود حداقل فضایی رو که تخصیص می دهد برای کش کردن کم کرد مثلا 5 مگابایت تا هر زمان پر شد یا دیگه کش نکند یا فایلهای قبلی رو پاک کند.


اونجا که کامنت کرده use 25% memory اونجا رو هم تغییر دادم .

یه نکته جالب اینکه اومدم  حافظه گوشی خودم رو تقریبا پر پر کردم بعد برنامه رو اجرا کردم . جالب بود رفتم توی مسیر کش دیدم بازم عکس کش کرده و available memory دستکاه رو که تقریبا صفر بود اومده بود نزدیک 11 مگابایت کرده بود آیا چیزی رو از حافظه من پاک کرده ؟
باتشکر از دوستان

کد پی‌اچ‌پی:
public class MemoryCache 

    private 
static final String TAG "MemoryCache";
 
   private Map<StringBitmapcache=Collections.synchronizedMap(
 
           new LinkedHashMap<StringBitmap>(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 View getView(final int positionView convertViewViewGroup parent) {
 
            View row convertView
 
            final ViewHolder holder;
 
           if (row == null) {
 
                
                 holder 
= new ViewHolder();
 
                LayoutInflater inflater = (LayoutInflatergetSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
                row inflater.inflate(R.layout.showitemsparentfalse);
 
       
                 holder
.image=(ImageView)row.findViewById(R.id.imagess);
 
                holder.image.getLayoutParams().height=x;
 
                holder.image.getLayoutParams().width=x;
 
           
                 row
.setTag(holder);
 
            }
 
           
             
else {
                
 
                holder = (ViewHolderrow.getTag();
            
 
            }
            

 
               new AsyncTask<StringVoidBitmap>() {

             
     protected Bitmap doInBackground(String... args) {
             
        try {
             
             
                         bitmap 
BitmapFactory.decodeStream((InputStream)new URL(data[position]).getContent());
             
    
                    
}
             
        
                     
catch (Exception e) {
             
             e.printStackTrace();
             
       }
             
     return bitmap;
             
      }

                @
Override
                
protected void onPostExecute(Bitmap result) {
                    
super.onPostExecute(result);
            
                    
holder.image.setImageBitmap(result);
                }

            }

            .
execute();
 
  
            return row
;
 
       

اما زمانی که اسکرول انجام می شود عکس ها دوباره لود می شوند آیا حتما نیاز به کش کردن هست برای اینکه بعد از اسکرول شدن دوباره لود نشود.
پاسخ

اندروید: کلید 2777 (قرار دادن عکس از اینترنت بدون cache کردن)

#2
سلام.
بنده یک نگاه کلی به کدهای کلاس انداختم، آن محدودیتی که برای حافظه (memory) تعیین شده است، مربوط به حافظه RAM است (نه حافظه Disk)، یعنی دو کلاس با نام های MemoryCache و FileCache داریم که کلاس MemoryCache مرتبط با حافظه RAM است (لغت memory را برای آن به کار برده) و کلاس FileCache مرتبط با ذخیره فایل ها در حافظه Disk می باشد.
در کلاس FileCache (که در آن آدرس پوشه ذخیره فایل ها را هم تعیین می کنیم)، روش clear برای پاکسازی پوشه در نظر گرفته شده :

کد:
public void clear(){
   File[] files=cacheDir.listFiles();
   if(files==null)
       return;
   for(File f:files)
       f.delete();
}

و در کلاس MemoryCache نیز روشی با نام clear برای پاکسازی حافظه RAM در نظر گرفته شده :

کد:
public void clear() {
   try{
       //NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
       cache.clear();
       size=0;
   }catch(NullPointerException ex){
       ex.printStackTrace();
   }
}


و در کل، در کلاس ImageLoader (که کلاس اصلی مورد استفاده ما است)، روش clearCache برای پاکسازی همزمان RAM و Disk در نظر گرفته شده که در واقع همان دو روش را اجرا خواهد کرد :

کد:
public void clearCache() {
   memoryCache.clear();
   fileCache.clear();
}

بنابراین بر اساس نیاز خود، می توانید از این روش ها استفاده کنید. یعن اجازه بدهید ابتدا عکس ها cache شوند، سپس آنها را پاک کنید (در واقع کدهای کلاس ها را دستکاری نمی کنید تا در دو حالت دلخواه ذخیره به صورت cache و یا عدم ذخیره، قابل استفاده باشند).

Flower
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط saeed ، شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان