Maison  >  Questions et réponses  >  le corps du texte

android - Comment mettre en cache les données d'objet Object renvoyées par la fusion RxJava

Utilisez la méthode de fusion de rxjava pour combiner les objets de données renvoyés par les deux API pour obtenir un objet, puis je souhaite utiliser la méthode SharedPreferences pour mettre en cache l'objet.

J'ai essayé de sauvegarder Objcet selon la méthode en ligne, mais cela n'a eu aucun effet. S'il vous plaît, aidez-moi à jeter un œil.

haricot :

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

ObjectUtil (utilisez SharedPreferences pour enregistrer et obtenir un objet) :

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

partie rxjava :

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);
            ...
    }
世界只因有你世界只因有你2737 Il y a quelques jours645

répondre à tous(1)je répondrai

  • 大家讲道理

    大家讲道理2017-05-16 13:36:50

    Donnez-vous une idée, utilisez la méthode d'élimination
    1. Utilisez ObjectUtil seul à d'autres endroits pour voir si vous pouvez stocker et récupérer un faux objet de données
    2 Imprimez le contenu de l'objet dans onNext pour voir s'il s'agit de l'objet attendu.
    3. S'il n'y a aucun problème avec les deux, vérifiez s'il y a un problème avec votre méthode setWeatherInfo

    répondre
    0
  • Annulerrépondre