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