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

我的 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 导入库给定野兔然后使用上述方法:

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 回答