android - Bagaimana untuk cache data objek Objek yang dikembalikan oleh rxjava merge
世界只因有你
世界只因有你 2017-05-16 13:34:50
0
1
661

Gunakan kaedah gabungan rxjava untuk menggabungkan objek data yang dikembalikan oleh dua apis untuk mendapatkan Objek, dan kemudian saya mahu menggunakan kaedah SharedPreferences untuk cache Objek.

Saya cuba simpan Objcet mengikut kaedah online, tetapi tiada kesan. Tolong bantu saya lihat.

Kacang:

public class LifeSuggestionResult implements Serializable{ ... }
public class WeatherFuture implements Serializable { ... }

ObjectUtil (gunakan SharedPreferences untuk menyimpan dan mendapatkan Object):

public class ObjectUtil {
    public static void setObject(String key, Object object, Context context) {

        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream out = null;
        try {

            out = new ObjectOutputStream(baos);
            out.writeObject(object);
            String objectVal = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
            editor.putString(key, objectVal);
            editor.commit();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static <T> T getObject(String key, Context context) {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
        if (sp.contains(key)) {
            String objectVal = sp.getString(key, null);
            byte[] buffer = Base64.decode(objectVal, Base64.DEFAULT);
            ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(bais);
                T t = (T) ois.readObject();
                return t;
            } catch (StreamCorruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bais != null) {
                        bais.close();
                    }
                    if (ois != null) {
                        ois.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

rxjava bahagian:

public void getCurrentWeather(final String city) {
        Observable<WeatherFuture> weatherFutureObservable = new WeatherService().getFutureWeather(city, "zh-Hans", "c");
        Observable<LifeSuggestionResult> lifeSuggestionResultObservable = new WeatherService().getAirQuality(city, "zh-Hans", "city");
        Observable.merge(weatherFutureObservable, lifeSuggestionResultObservable)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Object>() {
                    @Override
                    public void onCompleted() {
                                       
                    }

                    @Override
                    public void onNext(Object o) {
                        setWeatherInfo(o);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                });


    }

    public void setWeatherInfo(Object o) {
 
        if (o instanceof WeatherFuture) {
            ObjectUtil.setObject("WeatherFuture", o, MainActivity.this);
            ...
  }

        } else if (o instanceof LifeSuggestionResult) {
            ObjectUtil.setObject("LifeSuggestion", o, MainActivity.this);
            ...
    }
世界只因有你
世界只因有你

membalas semua(1)
大家讲道理

Beri anda idea, gunakan kaedah penyingkiran
1 Gunakan ObjectUtil sahaja di tempat lain untuk melihat sama ada anda boleh menyimpan dan mendapatkan kembali Objek data palsu
2 Cetak kandungan Objek di onNext untuk melihat sama ada ia adalah Objek yang diharapkan
3 Jika tiada masalah dengan kedua-duanya, maka semak sama ada terdapat masalah dengan kaedah setWeatherInfo anda

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan