Autore Topic: Condivisione e creazione di Java Beans tra Activity  (Letto 366 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Condivisione e creazione di Java Beans tra Activity
« il: 10 Maggio 2015, 18:47:59 CEST »
0
Non so se è esattamente la sezione corretta perché è più un problema di design che altro, e nel caso chiedo scusa.

Sto sviluppando un'applicazione Android che fa uso dell'EstimoteSDK e di Parse (per il lato database/server).

Non riesco a capire qual è il miglior modo di condividere le classi java bean tra le activity e visualizzarne i dati nelle textView.

Mi spiego meglio, la situazione per esempio è questa:

Ho una MainActivity nella quale voglio visualizzare la classe corrente in cui mi trovo. Questa activity permette di andare anche in altre classi e vedere le loro informazioni.

Tali dati vengono presi dal cloud di Parse tramite query secondo una certa logica (ad esempio ogni tot secondi tramite handler faccio la query).

Io ora non so dove e come creare i bean. Se ricrearli ogni volta o fare side-effect su un'unica istanza accessibile da tutte le Activity.

Ora come ora a livello di codice ho fatto una cosa del genere:

Activity

Codice: [Seleziona]
public class MainActivity extends Activity implements Observer {

    private BeaconManager beaconManager = new BeaconManager(this);
    private TextView uuidTextView;
    private Bean myBean;
    // i think that i can't create here all my java-beans class...

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        uuidTextView = (TextView)this.findViewById(R.id.uuid_textview);

        myBean = new Bean();

        // setting-up the BeaconManager

        EstimoteUtils.getInstance().setBackgroundScanPeriod(beaconManager);
        EstimoteUtils.getInstance().setRangingListener(beaconManager);
        myBean.addObserver(this);
        EstimoteUtils.getInstance().setBean(myBean);
    }

    @Override
    public void update(Observable observable, Object data) {

        MessageObserver msg = (MessageObserver)data;

        if(msg.getCode() == MessageObserver.QUERY_COMPLETE) {
            uuidTextView.setText("Beacon: " + msg.getMsg());
        }
    }

EstimoteUtils

Codice: [Seleziona]
public class EstimoteUtils {

    private static EstimoteUtils instance;
    private static Bean myBean;                // mi pare strano dover settare tutti i bean in questa classe per poter fare le query

    private EstimoteUtils() {
        // empty private constructor
    }

    public void setBean(Bean myBean) {
        this.myBean = myBean;
    }

    /**
     * Runnable that performs the query after a fixed time
     */
    private Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

            Log.i("Runnable: ", "runnable started, and the newID is: " + newID);

            if (!oldID.equals("")) {
                // performs the query
                BeanUtils.queryBean(newID, myBean);
            }
        }
    };

Bean

Codice: [Seleziona]
public class Bean extends Observable {

    private String classroom;

    public Bean() {

    }

    public void setClassroom(String classroom) {
        this.classroom = classroom;
        MessageObserver msg = new        MessageObserver(MessageObserver.QUERY_COMPLETE, classroom);
        setChanged();
        notifyObservers(msg);
    }

    public String getClassroom() {
        return classroom;
    }
}

BeanUtils

Codice: [Seleziona]
public class BeanUtils {

    public static void queryClassroom(String UUID, final Bean myBean) {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Classroom");
        query.whereEqualTo("BeaconUUID", UUID);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> objects, ParseException e) {
                if (e == null) {               
                    String result = objects.get(0).getString("Label");
                    if(result != null){
                        Log.i("Classroom", "Retrieved " + result );
                        sendNotification(result);
                        myBean.setClassroom(result);
                    }
                } else {
                    Log.e("Classroom", "Error: " + e.getMessage());
                }   
            }
        });     
    }

Mi sanguinano gli occhi a vedere questa cosa. Più che altro così facendo dovrei creare tutti i bean di cui ho bisogno nell'onCreate della mainActivity e settarli nell'EstimoteUtils, e passarli come parametro ai metodi delle classi utils per le query.

Ho pensato di fare tutti i bean come singleton, ma non so se è corretto, e potrei aver bisogno di più di un istanza.

Consigli?