2

我希望有人可以帮助我弄清楚如何缓存 Flickr Json 图像以缓存以更快地加载和离线使用......下面的代码来自教程,我已经弄清楚了所有这些,但在尝试阅读/使用时迷失了方向Android 开发人员资源和网络上的其他示例...非常感谢您提供解决方案并帮助完成这项工作...我是编程新手,感谢这里的知识 :)

 package com.windmillagency;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;








import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidFlickrActivity extends BT_activity_base {



    public String thisActivityName = "Flickr";

    ProgressDialog progressDialog;
    BackgroundThread backgroundThread;

    public class FlickrImage {
        String Id;
        String Owner;
        String Secret;
        String Server;
        String Farm;
        String Title;

        Bitmap FlickrBitmap;

        FlickrImage(String _Id, String _Owner, String _Secret, 
                String _Server, String _Farm, String _Title){
            Id = _Id;
            Owner = _Owner;
            Secret = _Secret;
            Server = _Server;
            Farm = _Farm;
            Title = _Title;

            FlickrBitmap = preloadBitmap();
        }

        private Bitmap preloadBitmap(){
            Bitmap bm= null;

            String FlickrPhotoPath = 
                    "http://farm" + Farm + ".static.flickr.com/" 
                    + Server + "/" + Id + "_" + Secret + "_m.jpg";

            URL FlickrPhotoUrl = null;

            try {
                FlickrPhotoUrl = new URL(FlickrPhotoPath);

                HttpURLConnection httpConnection 
                    = (HttpURLConnection) FlickrPhotoUrl.openConnection();
                httpConnection.setDoInput(true);
                httpConnection.connect();
                InputStream inputStream = httpConnection.getInputStream();
                bm = BitmapFactory.decodeStream(inputStream);

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return bm;
        }

        public Bitmap getBitmap(){
            return FlickrBitmap;
        }

    }

    class FlickrAdapter extends BaseAdapter{
        private Context context;
        private FlickrImage[] FlickrAdapterImage;;

        FlickrAdapter(Context c, FlickrImage[] fImage){
            context = c;
            FlickrAdapterImage = fImage;
        }

        public int getCount() {
            // TODO Auto-generated method stub
            return FlickrAdapterImage.length;
        }

        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return FlickrAdapterImage[position];
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ImageView image;  
            if (convertView == null) {
                image = new ImageView(context);  
                image.setLayoutParams(new Gallery.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
                image.setScaleType(ImageView.ScaleType.FIT_CENTER);  
                image.setPadding(8, 8, 8, 8);   
            } else {  
                image = (ImageView) convertView;    
            }  

            image.setImageBitmap(FlickrAdapterImage[position].getBitmap());

            return image; 
        }

    }

    FlickrImage[] myFlickrImage;

    /*
     * FlickrQuery = FlickrQuery_url 
     * + FlickrQuery_per_page 
     * + FlickrQuery_nojsoncallback 
     * + FlickrQuery_format
     * + FlickrQuery_tag + q
     * + FlickrQuery_key + FlickrApiKey
     */

    String FlickrQuery_url = "http://api.flickr.com/myflickrURL";
    String FlickrQuery_per_page = "&per_page=10";
    String FlickrQuery_nojsoncallback = "&nojsoncallback=1";
    String FlickrQuery_format = "&format=json";
    String FlickrQuery_tag = "&tags=";
    String FlickrQuery_key = "&api_key=";

    //  Apply your Flickr API:
    //  www.flickr.com/services/apps/create/apply/?
    String FlickrApiKey = "xxxxxxxxxxxxxxxxxxx";


    final String DEFAULT_SEARCH = "flickr";

    EditText searchText;
    Button searchButton;

    Gallery photoBar;

    Bitmap bmFlickr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.activityName = "AndroidFlickrActivity";
        BT_debugger.showIt(activityName + ":onCreate"); 

        //reference to base layout..
            LinearLayout baseView = (LinearLayout)findViewById(R.id.baseView);

            //setup background colors...
            BT_viewUtilities.updateBackgroundColorsForScreen(this, this.screenData);

            //setup background images..
            if(backgroundImageWorkerThread == null){
                backgroundImageWorkerThread = new BackgroundImageWorkerThread();
                backgroundImageWorkerThread.start();
            }           

            //setup navigation bar...
            LinearLayout navBar = BT_viewUtilities.getNavBarForScreen(this, this.screenData);
            if(navBar != null){
                baseView.addView(navBar);
            }

            //inflate this screens layout file...
            LayoutInflater vi = (LayoutInflater)thisActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View thisScreensView = vi.inflate(R.layout.flickr, null);

            //add the view to the base view...
            baseView.addView(thisScreensView);  

       searchText = (EditText)findViewById(R.id.searchtext);
        searchText.setText(DEFAULT_SEARCH);
        searchButton = (Button)findViewById(R.id.searchbutton);

        photoBar = (Gallery)findViewById(R.id.photobar);

        searchButton.setOnClickListener(searchButtonOnClickListener);
    }

    private Button.OnClickListener searchButtonOnClickListener
    = new Button.OnClickListener(){

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            progressDialog = ProgressDialog.show(AndroidFlickrActivity.this, 
                    "Progress", "Wait!");

            backgroundThread = new BackgroundThread();
            backgroundThread.setRunning(true);
            backgroundThread.start();




        }};


    private String QueryFlickr(String q){

        String qResult = null;

        String qString = 
                FlickrQuery_url 
                + FlickrQuery_per_page 
                + FlickrQuery_nojsoncallback 
                + FlickrQuery_format 
                + FlickrQuery_tag + q  
                + FlickrQuery_key + FlickrApiKey;

        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(qString);

        try {
            HttpEntity httpEntity = httpClient.execute(httpGet).getEntity();

            if (httpEntity != null){
                InputStream inputStream = httpEntity.getContent();
                Reader in = new InputStreamReader(inputStream);
                BufferedReader bufferedreader = new BufferedReader(in);
                StringBuilder stringBuilder = new StringBuilder();

                String stringReadLine = null;

                while ((stringReadLine = bufferedreader.readLine()) != null) {
                    stringBuilder.append(stringReadLine + "\n");
                    }

                qResult = stringBuilder.toString();
                inputStream.close();
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return qResult;
    }

    private FlickrImage[] ParseJSON(String json){

        FlickrImage[] flickrImage = null;

        bmFlickr = null;
        String flickrId;
        String flickrOwner;
        String flickrSecret;
        String flickrServer;
        String flickrFarm;
        String flickrTitle;

        try {
            JSONObject JsonObject = new JSONObject(json);
            JSONObject Json_photos = JsonObject.getJSONObject("photos");
            JSONArray JsonArray_photo = Json_photos.getJSONArray("photo");

            flickrImage = new FlickrImage[JsonArray_photo.length()];
            for (int i = 0; i < JsonArray_photo.length(); i++){
                JSONObject FlickrPhoto = JsonArray_photo.getJSONObject(i);
                flickrId = FlickrPhoto.getString("id");
                flickrOwner = FlickrPhoto.getString("owner");
                flickrSecret = FlickrPhoto.getString("secret");
                flickrServer = FlickrPhoto.getString("server");
                flickrFarm = FlickrPhoto.getString("farm");
                flickrTitle = FlickrPhoto.getString("title");
                flickrImage[i] = new FlickrImage(flickrId, flickrOwner, flickrSecret,
                        flickrServer, flickrFarm, flickrTitle);
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return flickrImage;
    }

    public class BackgroundThread extends Thread{
        volatile boolean running = false;
        int cnt;

        void setRunning(boolean b){
            running = b;    
            cnt = 10;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            String searchQ = searchText.getText().toString();
            String searchResult = QueryFlickr(searchQ);

            myFlickrImage = ParseJSON(searchResult);


            handler.sendMessage(handler.obtainMessage());
        }
    }

    Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub

            progressDialog.dismiss();
            photoBar.setAdapter(new FlickrAdapter(AndroidFlickrActivity.this, myFlickrImage));
            Toast.makeText(AndroidFlickrActivity.this, 
                    "Images Loaded", Toast.LENGTH_LONG).show();
        }

    };

}
4

1 回答 1

3

我建议你看看github上的Universal Image Loader 。

Universal Image Loader 让您可以轻松地在 Android 上以列表、图库和网格格式集成异步图像加载、缓存和渲染。如果您想实现自己的解决方案,阅读该项目的源代码是一个很好的开始方式。它由Sergey Tarasevich编写,并在BSD 3-clause下获得许可。

于 2012-04-26T06:24:21.247 回答