android - 缓存从互联网上获取的图像?

标签 android

我想缓存我通过互联网获取的图像。 这样每次在图库里刷图,就不会每次都去取了。如果有人能告诉我如何使用这段代码做到这一点,我们将不胜感激。

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


            }

       }

最佳答案

有几种方法可以做到这一点,假设来自 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
}

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

关于android - 缓存从互联网上获取的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793001/

相关文章:

android - 谷歌地图 v2 上的膨胀错误

java - 同时更新两个Android通知

Android - 仅在 Android 2.3 上发布的错误通知

android - 如何使用 Android 设备通过蓝牙发送文件

java - 在 firebase 的节点内添加列表

android - 显示以设置在 SwitchCompat 处于关闭状态时可见的文本?

android - 什么是 android 的 coredata 等价物

android - 应用程序许可和 Android 唯一 ID

java - 如何使用 Espresso 框架单击上下文操作栏项目

Android - 如何正确本地化内容?