【问题标题】:Android save info on return to activityAndroid 在返回活动时保存信息
【发布时间】:2012-06-03 04:49:52
【问题描述】:

对 android 非常陌生,想知道如何让这个示例代码返回到它停止的位置,而不是在返回屏幕时重新加载图片。现在,当我退出屏幕并返回时,我必须重新开始。我已阅读并尝试理解 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.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();
        }

    };

}

【问题讨论】:

    标签: android android-activity save return


    【解决方案1】:

    编写您的 Activity,以便它了解其当前状态。

    在您的onPause() 方法中,以您喜欢的任何方式保存该状态。 SharedPrefs、存储到数据库、存储到平面文件等。

    在您的 onResume() 方法中,读取该状态并恢复它。

    【讨论】:

    • 不确定在此代码中将 onPause 和 onResume 放在何处?谢谢
    • 这些是developer.android.com/reference/android/app/Activity.html 类的方法;由于您的类扩展了 Activity,您只需将它们添加为您的类方法 - 与添加 onCreate() 方法的方式相同。 terokarvinen.com/2011/… 演示了这些以及其他活动生命周期方法;您需要删除该页面显示的 toast,而是使用您自己的状态存储/检索。
    • 感谢链接,现在理解得更好了。我最大的问题是这是借用的示例代码,我什至不知道在哪里放置生命周期事件?你能在代码中告诉我你可以把它放在哪里吗?太新了,并试图弄清楚。已阅读大量链接
    • 请查看我在原始问题中编辑的代码。不知道在我的 onPause 和 onResume 中放什么以在我返回活动时保持图像加载,谢谢
    • 摆脱代码中的烘烤;该链接有那些只是为了证明他们被调用。搜索 SharedPreferences 以获取有关保存/恢复简单数据的指南。 developer.android.com/guide/topics/data/data-storage.html 有一个例子(但它使用 onCreate/onStop,虽然 onStop 不可靠;你应该使用 onPause/onResume)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多