2011-07-22 22 views
2

我想缓存我通过互联网获取的图像。 因此,每次图片在画廊中滑动时,都不会每次都抓取。如果有人能告诉我如何用这段代码做到这一点,将不胜感激。缓存从互联网获取的图像?

if(Build.VERSION.SDK_INT >= 11){ 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
} 


my.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     startActivity(n); 

    } 
}); 
gameNews.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

    } 
}); 

//Executing AsyncTask in background thread to get images. 
MyTask myTask = new MyTask(); 

myTask.execute(); 

} 

获取图像的方法:

//Method to get images from text documents that will by updated every month. 

public void getImages() throws IOException{ 


    DefaultHttpClient httpclient = new DefaultHttpClient(); 

    HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImages.txt"); 
    HttpResponse response; 

     response = httpclient.execute(httppost); 


      HttpEntity ht = response.getEntity(); 

      BufferedHttpEntity buf = new BufferedHttpEntity(ht); 

      InputStream is = buf.getContent(); 


      BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

      StringBuilder total = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       total.append(line + "\n"); 

       imageUrl = total.toString(); 
       Log.v("getImage1", "Retreived image"); 
      } 
    } 



      public void getImage2() throws IOException{ 

       DefaultHttpClient httpclient = new DefaultHttpClient(); 

       HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImage2.txt"); 
       HttpResponse response; 


        response = httpclient.execute(httppost); 


         HttpEntity ht = response.getEntity(); 

         BufferedHttpEntity buf = new BufferedHttpEntity(ht); 

         InputStream is = buf.getContent(); 


         BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

         StringBuilder total = new StringBuilder(); 
         String line; 
         while ((line = r.readLine()) != null) { 
          total.append(line + "\n"); 

          imageUrl2 = total.toString(); 
          Log.v("getImage2", "Retreived image"); 
         } 
       } 



         public void getImage3() throws IOException{ 

          DefaultHttpClient httpclient = new DefaultHttpClient(); 

          HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webimage3.txt"); 
          HttpResponse response; 


           response = httpclient.execute(httppost); 


            HttpEntity ht = response.getEntity(); 

            BufferedHttpEntity buf = new BufferedHttpEntity(ht); 

            InputStream is = buf.getContent(); 


            BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

            StringBuilder total = new StringBuilder(); 
            String line; 
            while ((line = r.readLine()) != null) { 
             total.append(line + "\n"); 

             imageUrl3 = total.toString(); 
             Log.v("getImage3", "Retreived image"); 
            } 

         } 

         public void getImage4() throws IOException{ 

          DefaultHttpClient httpclient = new DefaultHttpClient(); 

          HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImage4.txt"); 
          HttpResponse response; 


           response = httpclient.execute(httppost); 


            HttpEntity ht = response.getEntity(); 

            BufferedHttpEntity buf = new BufferedHttpEntity(ht); 

            InputStream is = buf.getContent(); 


            BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

            StringBuilder total = new StringBuilder(); 
            String line; 
            while ((line = r.readLine()) != null) { 
             total.append(line + "\n"); 

             imageUrl4 = total.toString(); 


          } 
} 

ImageAdapter类:

    //ImageAdapter that gets the URL of the images and put them in a format to be set to gallery 
     public class ImageAdapter extends BaseAdapter { 
      /** The parent context */ 
      private Context myContext;public ImageAdapter() { 
       // TODO Auto-generated constructor stub 
      } 
      /** URL-Strings to some remote images. */ 

      public String[] myRemoteImages = {imageUrl,imageUrl2,imageUrl3,imageUrl4}; 






      /** Simple Constructor saving the 'parent' context. */ 
      public ImageAdapter(Context c) { this.myContext = c; } 





      /** Returns the amount of images we have defined. */ 
      public int getCount() { return this.myRemoteImages.length; } 

      /* Use the array-Positions as unique IDs */ 
      public Object getItem(int position) { return position; } 
      public long getItemId(int position) { return position; } 

      /** Returns a new ImageView to 
      * be displayed, depending on 
      * the position passed. */ 
      public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView i = new ImageView(this.myContext); 

      try { 

          URL aURL = new URL(myRemoteImages[position]); 
          URLConnection conn = aURL.openConnection(); 

          conn.connect(); 

          InputStream is = conn.getInputStream(); 
          /* Buffered is always good for a performance plus. */ 
          BufferedInputStream bis = new BufferedInputStream(is); 
          /* Decode url-data to a bitmap. */ 

          Bitmap bm = BitmapFactory.decodeStream(bis); 
          bis.close(); 
          is.close(); 
          Log.v(imageUrl, "Retrieving image"); 

          /* Apply the Bitmap to the ImageView that will be returned. */ 
          i.setImageBitmap(bm); 
        } catch (IOException e) { 

          Log.e("DEBUGTAG", "Remtoe Image Exception", e); 
        } 

      /* Image should be scaled as width/height are set. */ 
      i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
      /* Set the Width/Height of the ImageView. */ 
      i.setLayoutParams(new Gallery.LayoutParams(150, 150)); 
      return i; 
      } 

      /** Returns the size (0.0f to 1.0f) of the views 
      * depending on the 'offset' to the center. */ 
      public float getScale(boolean focused, int offset) { 
      /* Formula: 1/(2^offset) */ 
      return Math.max(0, 1.0f/(float)Math.pow(2, Math.abs(offset))); 
      } 
      } 





     //the important AsyncTask method. running the background thread to get the images and set them to the gallery. 
      private class MyTask extends AsyncTask<Void, Void, Void>{ 


      @Override 
      protected Void doInBackground(Void... arg0) {try { 
         getImages(); 
         Log.v("MyTask", "Image 1 retreived"); 
         getImage2(); 
         Log.v("MyTask", "Image 2 retreived"); 
         getImage3(); 
         Log.v("MyTask", "Image 3 retreived"); 
         getImage4(); 
         Log.v("MyTask", "Image 4 retreived"); 
        } catch (IOException e) { 
         Log.e("MainMenu retreive image", "Image Retreival failed"); 
         e.printStackTrace(); 
        } 
       return null; 
      } 
      @Override 

      protected void onPostExecute(Void notUsed){ 
       ((Gallery) findViewById(R.id.gallery)) 
         .setAdapter(new ImageAdapter(MainMenu.this)); 


      } 

     } 

回答

1

有几个方法可以做到这一点,假设文件名从URL中是独一无二的,你可以把它们写到SD卡或内部存储。例如:

File cacheDir = new File("my-cache-dir"); 
File[] fileList = cacheDir.listFiles(); 
int index = linearSearch.(fileList, uri.getFileName()); 

if(index != -1){ 
// load from file 
} else { 
// load from web 
} 

还有其他几种方法可以做到这一点,如与数据库或平面文件。请记住,您必须每次为缓存内容生成相同的缓存密钥。

+0

有没有教程在这里? – YogoTi

+0

@YogoTi写入SD卡的教程是[可用](http://developer.android.com/guide/topics/data/data-storage.html#filesExternal)。至于生成特定于您的实现的密钥。你写的是一个专门的[Web Cache](http://en.wikipedia.org/wiki/Web_cache),所以如果你担心你的密钥只是使用url。 –

+0

嘿丹我知道我可能会问很多,但我不是真正的Android开发者指南的拥抱爱好者。你熟悉这样做吗? – YogoTi