Dopo aver iniziato a capire come funziona il mondo J2ME è interessante prendere confidenza con le risorse di cui disponiamo. Prima di tutto dobbiamo renderci conto di non avere a disposizione il linguaggio JAVA, ma un suo piccolo dialetto.
Quindi per iniziare a meglio addentrarci in questo intrigante mondo vediamo come sia possibile reperire informazioni tramite Network (package di interesse javax.microedition.io.*).
Immaginiamo di avere a disposizione un nostro applicativo server-side (magari un webservice, ma di questo parleremo ancora più avanti!) che quando lo richiamiamo tramite web ci restituisce le 5 ultime notizie del giorno.
Per accedere a delle risorse in J2ME abbiamo la classe Connector, che viene instanziata con l'url di interesse della risorsa, che non deve essere necessariamente http (ad esempio file:// se ci troviamo a programmare su Siemens, socket://, etc etc.).
Ma vediamo subito un pezzo di codice per capire meglio di cosa stiamo parlando:
HttpConnection hc = null;
InputStream is = null;
StringBuffer b;
String GET_URL = "http://quelsito.it/notizie.php";
hc = (HttpConnection)Connector.open(GET_URL);
is = hc.openInputStream();
while ((char)(ch = is.read()) != -1) {
b.append((char)ch);
System.out.println((char)ch);
}
s = new String(b.toString());
Vediamo in questo pezzo di codice come viene inizializzata la HttpConnection e viene costruito su di essa un InputStream dal quale si estraggono le informazioni che cercavamo.
In questo modo sia riusciti a connetterci al web, questo chiaramente su dispositivo reale è vincolato dalla effettiva connessione GPRS, che in una certa zona può esserci o meno. Provando questo codice sull'emulatore della SUN, se siamo connessi ad Internet, l'emulatore ci permetterà di vedere come la nostra applicazione davvero si comporta.
Il fatto che esista il costrutto socket:// vi fa intuire che sia possibile crearsi un proprio client magari per una qualsivoglia applicazione. Un esempio di ciò è una famosa midlet freeware muTelnet, implementazione J2ME di un client telnet. Per un completo elenco delle classi e delle funzionalità consiglio di andarvi a vedere le API riguardanti il package javax.microedition.io.*, che semplicemente riassume le interfacce disponibili per l'I/O in J2ME, interfacce che devono essere usate prima di tutto per fare il casting del Connector iniziale che crea la vera e propria "connessione" alla risorsa a cui vogliamo accedere.
Queste informazioni possono essere semplicemente visualizzate a schermo nel seguente modo
Form aForm = new Form("Ultime 5 notizie");
aForm.append(s); //Appendo la stringa ottenuta prima
Display d = Display.getDisplay(this);
d.setCurrent(aForm);
Oppure possiamo pensare di memorizzare queste informazioni sul cellulare. Visto che le MIDlet vengono eseguite all'interno di un sandbox come le applet, non abbiamo accesso al "filesystem" del cellulare. Dobbiamo così ricorrere all'unico metodo che le API J2ME attualmente ci offrono per garantire la persistenza, ovvero RMS.
Questo sistema prevede la memorizzazione di informazioni come una lista concatenata, che noi possiamo scorrere e organizzare logicamente nella maniera a noi più consona: se dobbiamo avere a disposizione una sorta di rubrica telefonica memorizzeremo negli slot dispari il nome e in quelli pari il numero ad esempio.
I metodi di ricerca all'interno dell'RMS mi ricordano molto altri linguaggi di programmazione dove vai a lavorare byte a byte quindi in un primo momento per chi è abituato a programmare solo in Java potrebbe risultare ostici ma sono comunque di semplice utilizzo.
Il package che contiene le classi per l'RMS è javax.microedition.rms e viene supportato di default dalla versione MIDP 1.0 e CDLC 1.0.
L'unica classe di questo package è RecordStore che serve alla creazione/modifica/cancellazione del nostro RMS.
Con il metodi statici openRecordStore e deleteRecordStore creiamo il nostro RMS e lo cancelliamo.
RecordStore recordStore = RecordStore.openRecordStore("prova", true);
RecordStore.deleteRecordStore(recordStore);
Vediamo poi che tra le funzioni di maggiore utilità c'è getNumRecords() che ci restituisce il numero di record attualmente in uso nel nostro RMS (utile per scorrere il nostro RMS in un ciclo for).
Altre interessanti feature presenti nel package javax.microedition.rms sono le interfacce RecordListener, RecordComparator, RecordEnumeration e RecordFilter. La prima permette di aggiungere un listener che notifica alla midlet quando il nostro RMS subisce delle modifiche mentre le altre sono delle interfacce che permettono di definire dei metodi di ricerca e filtraggio all'interno del nostro RMS, anche se nella maggior parte dei casi conviene crearsi da soli dei metodi di ricerca ottimizzati per l'applicazione che dobbiamo sviluppare.