1

尝试将图像存储在此 Flickr 画廊中,因此当用户离开活动并返回图像时不需要再次加载...我一直在阅读有关在 onPause 方法中使用的 getSharedPreferences 以防止图像被破坏...唯一的问题是我找不到任何处理图像只有文本字段等的例子......感谢您的帮助

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.content.SharedPreferences;
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/services/rest/?method=flickr.people.getPublicPhotos&api_key=fdd73dc07613841fbe325b5103d673b7&user_id=65005067@N08&per_page=25&format=json";
    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 = "fdd73dc07613841fbe325b5103d673b7";


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


///////////////////////////////////////////////////
//activity life-cycle overrides


//onResume
@Override
public void onResume() {
super.onResume();
//Log.i("ZZ", thisActivityName + ":onResume");
tToast("onResume");
}       



private void tToast(String s) {
    Context context = getApplicationContext();
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(context, s, duration);
    toast.show();
}


//onPause
@Override
public void onPause() {
//Log.i("ZZ", thisActivityName + ":onPause");
super.onPause();

tToast("onPause");
}







//activity life-cycle overrides
///////////////////////////////////////////////////


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

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            progressDialog = ProgressDialog.show(AndroidFlickrActivity.this, 
                   "Progress", "Please 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

0

我认为您需要的是图像缓存。存储 SharedPreferences 带有内存限制。如果图片数量很大,可以试试 这个库进行图片缓存:

希望这可以帮助 !

于 2012-06-23T11:18:13.353 回答