Passa ai contenuti principali

Mini Guida a Java ME

Java Micro Edition è sicuramente uno degli strumenti più potenti per la scittura di applicazioni per piccoli elettrodomestici, cellulari e PDA, in questa mini guida vedremo gli aspetti fondamentali della tecnologia e del linguaggio

Introduzione

Questa è una mini guida dedicata a chi ha già esperienza di programmazione in Java e che voglia sapere come è strutturata la piattaforma JavaME. Non troverete codice esemplificativo e applicazioni intere (che potrete comunque trovare nel sito) ma semplicemente una panoramica della tecnologia e della gestione dei package, dell'interfaccia utente e dello storage delle informazioni.
Una miniguida semplice e da leggere tutta d'un fiato.
Giuseppe Caliendo [capitanfuturo]

I. Introduzione alla tecnologia

La piattaforma J2ME è stata annunciata nel giugno del 1999 al JavaOne Developer Conference, non è quindi recentissima e ripropone gli stessi principi della versione madre SE riadattandoli a dispositivi meno potenti dei personal computer. L'obiettivo primario rimane sempre quello di portabilità del codice, cioè della possibilità di proporre programmi compatibili per la più vasta gamma di apparecchi, che siano cellulari, PDA o elettrodomestici. Java 2 Micro Edition è un sottinsieme della Standard Edition ed è stata disegnata per due categorie di dispositivi:
  1. Personal mobile information devices (dispositivi con buone capacità di connessione ma non sempre connessi come ad esempio cellulari e palmari)
  2. Shared-connection information devices(dispositivi sempre connessi come telefoni fissi digitali, console e navigatori)
Ecco come si presenta l'architettura del linguaggio:
Dallo schema si possono osservare quelle che vengono chiamate le configurazioni che definiscono l'ambiente di runtime dove gireranno le nostre applicazioni e in particolare la virtual machine usata.
CDC
'Connected Device Configuration' per i dispositivi:
  • collegati alla rete con una banda discreta
  • 512 Kb di memoria disponibile per caricare il programma Java
  • 256 Kb di memoria per l'esecuzione del programma
CLDC 'Connected Limited Device Configuration' per i dispositivi:
  • connessi in maniera discontinua e wireless alla rete
  • con poca larghezza di banda
  • con interfaccia utente ridotta
  • 128 Kb di memoria per l'installazione dell'applicazione
  • 32 Kb di memoria per l'esecuzione dell'applicazione
  • bassi consumi
nota: all'interno di questa configurazione è possibile usare sia la KVM con uso di memoria ridotta, 40/80 Kb + 20/40 Kb su sistemi a 16bit e clock a 25 Mhz e la HVM per processori ARM

Sopra le configurazioni stanno i profili, cioè quell'insieme di componenti software che sono resi disponibili alla virtual machine della configurazione a cui fa riferimento.

II. Consigli prima di iniziare[/size]

Parliamo un pò degli ambienti di sviluppo e di alcuni consigli utili per chi come me, preferisce progettare prima di buttarsi nello scrivere codice. Esistono varie utilities gratuite per sviluppare, installare, distribuire, emulare ed integrare le proprie applicazioni. L'ambiente di sviluppo offerto dalla Sun è il J2MEWT 'Java 2 Micro Edition Wireless Toolkit' scaricabile dal sito del produttore. In rete è possibile trovare anche buona documentazione sull'installazione. Passiamo quindi a fornire delle indicazioni sullo sviluppo della nostra applicazione. Bisogna sempre ricordare che il codice andrà a girare su dei dispositivi particolari: piccoli, mobili, con un'interfaccia utente minima, eterogenei e limitati.
Le tre regole generali sono quindi:
  1. L'applicazione deve essere semplice: al livello computazionale e di usabilità
  2. La memoria va usata con parsimonia: evitate allocazioni inutili, utilizzate i tipi primitivi del linguaggio e non gli oggetti che li rimappano, fate le inizializzazioni in fase di dichiarazione delle variabili, evitate le eccezioni
  3. L'applicazione deve essere piccola: non disponiamo di molta memoria, le immagini vanno quindi compresse e ridimensionate e l'applicazione va fornita in formato JAR
Altri consigli sono: usare il pattern MVC model-view-controller per separare la logica business da quella grafica. Privilegiate le variabili locali a quelle di classe per avere accessi più veloci, utilizzare i thread ma evitare le sincronizzazioni. Se state pensando ad applicazioni server-client tenete presente di portare la parte computazionale sul lato server... e poi sbizzarritevi!!!
Ovviamente nel limite del possibile...

III. La nostra prima MIDlet

Finalmente siamo pronti per la nostra prima MIDlet e questo capitolo della guida sarà dedicato solo a lei.
Una MIDlet è un'applicazione molto simile nella struttura ad una Applet, infatti non c'è un metodo main ed estende una classe astratta MIDlet di cui eredita alcuni metodi che devono essere implementati da noi e che sono necessari per poter essere eseguita. La nostra MIDlet viene eseguita all'interno di quello che si chiama AMS Application Management Software ed è per questo che devono essere implementati i seguenti tre metodi:
  • startApp() avvisa la MIDlet che è stata avviata dall'AMS
  • pauseApp() usato quando la MIDlet è in pausa
  • destroyApp() quando è imposto il termine della MIDlet
La MIDlet può avvisare il proprio cambiamento di stato all'AMS grazie ad alcuni metodi:
  • notifyPaused() avvisa l'AMS che la MIDlet si è posta in pausa
  • resumeRequested() richiede all'AMS di poter ripristinare l'esecuzione
  • notifyDestroyed() indica l'intenzione di terminare l'applicazione
Nella nostra prima applicazione implementeremo solo startApp()... vediamola

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloWorld extends MIDlet {
Display display; //oggetto della classe display
Form form; //oggetto di tipo screen, contenitore per altri oggetti
public destroyApp(boolean unconditional){ //impone il termine all'esecuzione
notifyDestroyed();
}
//avvisa la MIDlet di essere stata messa in pausa
public void pauseApp(){ }
//metodo di partenza della MIDlet
public void startApp(){
display = Display.getDisplay(this); //display del dispositivo
form = new Form("Capitanfuturo"); //creo un contenitore
StringItem stringa = new StringItem(null,"Hello world!");
form.append(stringa); //gli appendo una stringa
display.setCurrent(form); //rendo visibile il form
}
}


IV. Principali package

nCome abbiamo visto nella seconda parte della guida J2ME è una piattaforma generale che mette a disposizione vari package a seconda delle configurazioni e dei profili. A noi interessa il profilo MIDP della configurazione CLDC perchè è il più usato per le applicazioni sui cellulari.
Al livello MIDP possiamo disporre dei seguenti packages noti ai programmatori Java: (per approfondimenti su tutte le classi basta vedere la documentazione delle API sul sito della Sun)
  • java.lang (ovviamente)
  • java.io
  • javax.microedition.io (gestisce i datagram e le connessioni)
  • javax.microedition.lcdui (per la gestione del display del dispositivo e dell'interfaccia utente)
  • javax.microedition.midlet (ogni MIDlet estende questa classe cfr.II)
  • javax.microedition.rms (per il salvataggio delle informazioni sul dispositivo)
esistono infine dei package opzionali che differiscono a seconda del dispositivo e che possono anche essere forniti dalla casa costruttrice (vedi ad es. Nokia) ma che in questa sede non parleremo.

V. Interfaccia Utente

In JavaME l'interfaccia utente rispecchia la struttura di quella dell SDK anche se ovviamnete è ridotta. Tutto quello che c'è da sapere è nel package javax.microedition.lcdui. Ogni applicazione ha a disposizione un'istanza dello schermo su cui sta girando, rappresentata dall'oggetto Display. Gli oggetti che possiamo visualizzare all'interno del display sono tipicamente di due tipi:
  1. Alto livello: Screen e tutti gli oggetti che ne derivano
  2. Basso livello: Canvas e le altri classi tra cui 3D per grafica pixel a pixel
VI. Storage delle informazioni

Un'applicazione che si rispetti ha la necessità di poter archiviare delle informazioni sul dispositivo, impostazioni dell'utente, record ecc. I dispositivi su cui scriviamo il codice dispongono di una memoria RAM minima (almeno secondo le specifiche vedi I parte) ma spesso hanno anche una memoria non volatile che può fare al caso nostro. L'unico problema è che non disponiamo di un file-system e per questo il linguaggio ci viene incontro con un'astrazione: la classe RMS Record Management Store. Ogni applicazionepuò dotarsi di un rms indipendente dalle altre applicazioni e lo storage è gestito secondo record che contengono byte[ ] array di byte.

VII. Conclusioni

JavaME è una soluzione molto interessante e flessibile come lo stesso Java SDK. Le possibilità di poter scrivere delle applicazioni non sono semplicemente legate al target dei giochi ma con un pò di fantasia e pazienza può spaziare ad applicazioni client server fatte ad-hoc per le nostre imprese e molto altro, visto anche le migliorie dei dispositivi che abbiamo davanti.

Post popolari in questo blog

Se excel non aggiorna le formule

Oggi in ufficio è capitata una richiesta particolare. In un documento excel dopo aver eseguito un copia-incolla di una formula non si aggiornavano i risultati nelle celle interessate. Dopo attimi di perplessità dal fondo dell'ufficio il capo ci illumina con una funzione ai più sconosciuta e che ha risolto il problema: il tasto F9. Scusate la mia ignoranza in excel ma questo blog è pensato proprio per appuntare esperienze di vita informatica. Tutto sta nel fatto che i "calcolatori d'un tempo" non disponevano di una adeguata potenza di calcolo e nelle operazioni di copia-incolla si verificavano lunghe attese per l'aggiornamento. La soluzione adottata da MS è stata quella di inserire un'opzione per impedire l'aggiornamento automatico e forzarlo con una combinazione di tasti... il tasto F9!
Combinazioni utili per il calcolo delle formule F9 = calcola le formule modificate dall'ultimo calcolo in tutte le cartelle e fogli di lavoro aperte. MAIUSC + F9 = c…

Riflessioni sull'ordinamento

Gli algoritmi di ordinamento sono da sempre i più gettonati e interessanti dal punto di vista didattico (si veda la complessità computazionale) e funzionale (quasi tutti i programmi hanno almeno una funzione di ricerca). Proprio di questi giorni sono alcuni articoli di Programmazione.it dedicati a questo tema (link).Coding Horror in questo articolo presenta una provocazione molto interessante al di là delle opinioni personali:

The default sort functions in almost every programming language are poorly
suited for human consumption.
L'articolo pone l'attenzione sulla differenza tra l'ordinamento alfanumerico e quello ASCII solitamente usato nei metodi nativi dei linguaggi. Il discorso si ampia se poi pensiamo banalmente alla differenza tra Windows e GNU/Linux che è case sensitive.
Spesso i sistemi operativi e i linguaggi di programmazione realizzano ordinamenti rispettando l'ordine della tabella di codifica ASCII e non l'ordinamento naturale della lingua. I commenti a se…

Timeline dei Linguaggi di programmazione

O'Reilly ha reso disponibile per tutti gli appassionati un interessante poster in formato pdf in cui vengono riassunti 50 anni di storia dei linguaggi di programmazione.Il poster mostra una timeline colorata nella quale sono evidenziate le principali derivazioni tra i vari linguaggi... da vedere
http://www.oreilly.com/news/graphics/prog_lang_poster.pdf



fonte programmazione.it