1

アプリでイグニッションを使用して、mStudentObject などの複合オブジェクトをキャッシュしました。データを正常にキャッシュしました。問題は、最近実行中のアプリ ボタン (現在実行中のタスク ボタン) からアプリを強制終了した後にオブジェクトを取得すると、キーに対してデータが見つかりません (キャッシュは自動的にクリアされます)。 - アプリを起動 (最近のタスクからアプリを強制終了せずに) オブジェクトが正しく取得されました。コードの何が問題なのかわかりません。オブジェクトを 2 日間永続的にキャッシュしたいと考えています。アプリを起動するたびに、アプリはキャッシュされたオブジェクトからデータを取得する必要があり、現在実行中のタスクからアプリを強制終了するかどうかを選択します。アイデアがあれば、共有してください。私の完全なコードは次のとおりです。

public class MainActivity extends Activity {

    Button[] buttons = null;

    // ObjectLRUCache objectLRUCache = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttons = new Button[2];
        buttons[0] = (Button) findViewById(R.id.button1);// to save data
        buttons[1] = (Button) findViewById(R.id.button2); // to get data
        // final Student s = new Student("imran", 23, 16);
        buttons[0].setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (IgnetionHelper.getInstance()!= null) {
                    Log.d("test", "key contains, updating");
                    Student s = new Student("imran", 23, 16);

                    IgnetionHelper.getInstance().putData(s);
                } else{
                Log.d(""test),"instance is null..");

            }
        });
        buttons[1].setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                IgnetionHelper ddd = IgnetionHelper.getInstance();
                if (IgnetionHelper.getInstance().getData()!= null) {
                    Student s = (Student)  IgnetionHelper.getInstance().getData();
                    Log.d("test", "key contains, age is: " + s.age);

                } else {
                    Log.d("test", "data is null...");
                }

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

My Person クラスは次のとおりです。

public abstract class Person extends CachedModel implements Serializable{
    public String name = "";
    public int age = 0;

    public Person(){};

    public Person (String name,int age) {
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }



}

学生クラスは次のとおりです。

public class Student extends Person{
    public String name = "";
    public int age = 0;


    public int rollNo = 0;


    public Student(){

    }

    public Student(String name, int age, int rollno) {

        this.rollNo = rollno;
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public int getRollNo() {
        return rollNo;
    }

    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }

    @Override
    public boolean reloadFromCachedModel(ModelCache modelCache,
            CachedModel cachedModel) {

        Student student = (Student) cachedModel; 
        name =  student.name;
        age = student.age; 
        rollNo = student.rollNo; 

        return false;
    }

    @Override
    public String createKey(String id) {
        // TODO Auto-generated method stub
        return id;
    }
}

最後に、点火ヘルパー クラスは次のとおりです。

 public class IgnetionHelper {
        private static final String KEY_FOR_MYOBJECT = "MY_TEST_KEY";
        private static ModelCache cache;
        private final static int initialCapacity = 1000;
        private final static int maxConcurrentThreads = 3;
        private final static long expirationInMinutes = 60 * 24 * 2;
        private static IgnetionHelper mIgnetionHelper = null;

        public static IgnetionHelper getInstance() {
            if (cache == null)
                cache = new ModelCache(initialCapacity, expirationInMinutes,
                        maxConcurrentThreads);
            if (mIgnetionHelper == null)
                mIgnetionHelper = new IgnetionHelper();
            return mIgnetionHelper;
        }

        public boolean putData(CachedModel model) {

            model.setId(KEY_FOR_MYOBJECT);
            if (model.save(cache)) {
                Log.d("IgnetionHelper", "saved.....");
                return true;
            } else {
                Log.d("IgnetionHelper", "saved.....");
                return false;
            }
            // CachedModel model = Feed.find(cache, key, Feed.class);
            // if (model != null) {
            // Log.d("test", "key contains, updating");
            // Feed s = (Feed) model;
            // return s.save(cache);
            // }
        }

        public CachedModel getData() {
            return Student.find(cache, KEY_FOR_MYOBJECT, Student.class);

        }
    }
4

2 に答える 2

3

私は私の問題の解決策を見つけました。あなたが学生のオブジェクトを持っているとしましょう

Student s = new Student("imran",16,23);

次に、ignetionhelper 呼び出しでこれらのメソッドを実装します。

public static boolean putData(Object object, Context context,String key) {
    return GenericStore.saveObject(GenericStore.TYPE_MEMDISKCACHE,key, (Serializable) object, context.getApplicationContext());
}

public static Object getData(Context context,String key) {
    return GenericStore.getObject(GenericStore.TYPE_MEMDISKCACHE,key, context.getApplicationContext());
}

https://github.com/wareninja/generic-store-for-android import library を指定て、上記のメソッドを次のように使用します。

IgnetionHelper.putData(s, context, IgnetionHelper.YOUR_KAY);
Student s=(Student)IgnetionHelper.getData(context,IgnetionHelper.YOUR_KAY);
于 2013-03-07T07:04:28.383 に答える
1

ディスクに保存されているキャッシュを使用する必要があります。アプリが強制終了されると、使用しているキャッシュがクリアされたように見えます。

キャッシュ ストレージに関する Google からの情報がhttp://developer.android.com/guide/topics/data/data-storage.htmlあります。アプリ内のデータ キャッシュのいくつかのオプションについて、この既存の SO 回答を確認してください。Android でデータをキャッシュする

于 2013-03-06T13:30:35.837 に答える