J2ME FAQ
Domande generali
- Cosa è JavaME (Java 2 Micro Edition)?
- Cosa è una configurazione?
- Cosa è un profilo?
- Posso usare più di un profilo alla volta?
- Come posso aggiungere una certa API (Bluetooth, WMA, MMAPI..) ad un dispositivo che non ha il supporto nativo per questa?
- Quali sono i dispositivi che supportano JavaME?
- Che c'entra PersonalJava con JavaME?
- Ho fatto il porting di una KVM/CVM per qualche piattaforma. Posso distribuirla/venderla?
- Quali sono i campi minimi che devono essere presenti nel MANIFEST di una MIDlet?
- Quali sono i campi minimi che devono essere presenti nel JAD?
- Ho sentito il termine J2ME, ma non JavaME. Cosa è JavaME?
- Dove posso trovare il sito degli sviluppatori e le SDK di XXX?
- Come posso fare un gioco? Ho bisogno di imparare Java prima?
- Quali sono le differenze base tra sviluppare in J2SE e in J2ME?
- Quanto Heap, che dimensioni dello schermo, che versione di MIDP o CLDC ha un certo dispositivo?
- Dove posso trovare informazione su una certa API per vedere se possibile fare una certa cosa con J2ME?
- Come posso sapere se il mio cellulare supporta una certa JSR?
Configurazioni
- Quali sono i requisiti minimi per CLDC?
- Voglio/ho bisogno di usare dei metodi nativi. Come posso farlo?
- CLDC supporta le operazioni in virgola mobile?
- Quali sono i requisiti mini per CDC?
Profili
- Cosa è MIDP?
- Qual'è la versione corrente delle specifiche MIDP?
- Per cosa sta l'acronimo LCDUI?
- E' disponibile MIDP per Palm OS?
- Posso accedere alla rubrica del mio PDA dalla mia MIDlet?
- MIDP supporta le operazioni in virgola mobile?
- Quando sarà disponibile il profilo PDA (Personal Digital Assistant)?
- Perchè non riesco a trovare nessuna classe grafica nel Foundation profile?
- Cosa è il Personal Profile?
- Che differenze ci sono tra Personal Profile e Personal Basis Profile?
Networking
- Come posso comunicare con un server FTP, con un database, con www.server.com:XXX ?
- Come posso connettermi ad un database? Posso usare SQL?
- In che linguaggio devo scrivere il mio server?
- Perchè viene lanciata un'eccezione quando provo a connettermi ad un Web Services dall'emulatore WTK?
- Dove posso trovare la lista di access point GPRS per Internet e non solo per l'accesso WAP?
- Posso mandare SMS/MMS dalla mia MIDlet?
- Quali numeri di porta posso usare per gli SMS (WMA) ?
- Cosa è il Generic Connection Framework?
- Voglio creare una connessione TCP/UDP/XYZ con un server. Posso farlo con MIDP?
- Come posso creare un Server Socket con GCF?
- Posso chiamare un numero di telefono dalla mia MIDlet?
- Posso determinare il numero di telefono dalla mia MIDlet?
- Quando sto utilizzando connessioni HTTP, ricevo il messaggio 'java.io.IOException: exceeded the configured maximum number of connections'. Perchè?
- Posso determinare l'ip del mio dispositivo con la mia MIDlet?
- Come posso realizzare connessioni HTTP persistenti con un server?
- Come posso dire al dispositivo che non voglio mantenere persistenti le connessioni?
- Posso riutilizzare lo stesso oggetto HttpConnection più di una volta?
Grafica
- Posso creare nuovi elementi da aggiungere alle Form?
- Posso creare un Image da un array di byte. Posso recuperare l'array di byte da un Image?
- Come posso avere la notifica di eventi della tastiera con una Form, TextArea o List in MIDP?
- Posso sottolineare il testo nella mia TextField o in un TextBox, o in una StringItem contenuta in una Form?
- Posso assegnare oggetti Command a specifici soft key?
- Quando avvio la mia MIDlet nell'emulatore, le immagini si caricano normalmente. Quando poi provo la MIDlet sul dispositivo le immagini non vengono visualizzate.
- Voglio visualizzare uno schermo "Attendere prego..." mentre eseguo un processo lungo (network ad esempio), ma lo schermo di attesa non appare mai e dopo che il processo è finito appare. Cosa c'è di sbagliato?
- Come posso mettere una Canvas dentro una Form o usare gli elementi grafici di alto livello con una Canvas?
- Perchè quando la mia applicazione, utilizzando myDisplay.setCurrent(nextCanvas), cambia tra diverse canvas io non le vedo?
Sicurezza
- Posso caricare una classe che si trova fuori della mia MIDlet suite?
- Come posso rimuovere i fastidiosi permessi che vengono richiesti all'utente?
Runtime
- Come posso leggere un file dentro il JAR?
- Come posso dire al mio dispositivo di far partire la mia MIDlet quando avviene qualcosa?
- Cosa accade ai miei thread quando la MIDlet viene sospesa?
- Quali proprietà di sistema sono disponibili per determinare il tipo di dispositivo a runtime?
- Vorrei avere informazioni di localizzazione fisica del mio dispositivo. E' possibile?
- Cosa significa l'errore "Unable to create MIDlet SimpleGame java.lang.ClassNotFoundException: SimpleGame"?
Sviluppo
- Quali sono i tool di cui ho bisogno per iniziare a sviluppare?
- Come è un semplice file build.xml di ANT?
- Dove posso trovare le varie implementazioni di riferimento (RI) per le configurazioni e i profili di J2ME?
- Quale è l'equivalente del "Hello World" in J2ME (MIDP)?
- Quando provo ad offuscare la mia MIDlet, RetroGuard muore. Perchè?
- Quando preverifico le mie classi mi viene restituito l'errore "Class loading error: Bad major version number". Perchè?
- Come posso usare JDWPI per effettuare il debug di una MIDlet all'interno dell'emulatore del Wireless Toolkit?
- Come posso aggiungere immagini e altre risorse al mio progetto nel Wireless Toolkit?
Installazione
- Come posso scaricare la mia MIDlet su un cellulare o su un dispositivo mobile?
- Quali sono i tipi MIME per i file JAR e JAD?
- Ricevo il messaggio "invalid file" quando provo ad installare la mia MIDlet. Qual'è il problema?
- Come posso aggiornare automaticamene la mia MIDlet?
Gestione della memoria
- Cosa è la Garbage Collection?
- Qual'è l'equivalente Java di delete?
- Cosa succede quando richiamo System.gc()?
- Quando avviene la Garbage Collection, cosa succede?
- Come posso essere sicuro di rendere un oggetto idoneo per la Garbage Collection?
- Come posso evitare che il mio oggetto sia idoneo per la Garbage Collection?
- Quando scrivo a schermo un oggetto ottendo qualcosa del tipo Object@345563. E' l'indirizzo dell'oggetto?
- Come posso gestire gli OutOfMemoryErrors?
- Domande generali
-
Cosa è JavaME (Java 2 Micro Edition)?
JavaME è un termine che racchiude una serie di macchine virtuali, API e altri elementi che mettono a disposizione Java su dispositivi come Palmari, cellulari e in generale dispositivi di calcolo con capacità limitate rispetto ai normali PC. -
Cosa è una configurazione?
Una configurazione definisce una Virtual Machine e un minimo di API che devono essere presenti. Nella definizione di una Virtual Machine, la configurazione specifica il minimo di memoria che deve essere presente, il tipo di processore e la velocità di questo. -
Cosa è un profilo?
Un profilo si riferisce a delle API per uno specifico dominio. Per esempio MIDP (Mobile Information Device Profile) definisce le API che sono disponibili per dispositivi come cellulari, PDA e simili. -
Posso usare più di un profilo alla volta?
Si, a patto che la Virtual Machine e il dispositivo in questione supporti la funzionalità di un profilo aggiuntivo. Per esempio i produttori possono fornire i propri profili in aggiunta a MIDP per permettere alle MIDlet di accedere a feature specifiche delle proprie device, come ad esempio informazioni contenute nella SIM card. Tuttavia, se questo tipo di profilo viene fornito ad esempio da Nokia, non sarà chiaramente portabile su altre device, ad esempio Motorola. -
Come posso aggiungere una certa API (Bluetooth, WMA, MMAPI etc. etc.) ad un dispositivo che non ha il supporto nativo per questa?
Non è possibile. Infatti le API che si vogliono utilizzare devono essere presenti sul dispositivo. In toeria per aggiungerle bisognerebbe avere un aggiornamento del firmware, una cosa che può essere fatto solo dal produttore del dispositivo. Ad esempio, le MMAPI (Mobile Media API) definisco un API per accedere a cose come la fotocamera sui dispositivi. Gli sviluppatori possono utilizzare queste API per scrivere applicazione che sfruttano la fotocamera. Tuttavia scrivere un'applicazione del genere e caricarla su un dispositivo che non ha questo supporto non ci permette di avere accesso alla fotocamera. Queste API vengono definte opzionali, quindi devono essere supportate dalla Virtual Machine del dispositivo per essere utilizzare. -
Quali sono i dispositivi che supportano JavaME?
Liste (non sempre aggiornate) dei dispositivi possono essere trovate ai seguenti indirizzi: -
Che c'entra PersonalJava con JavaME?
PersonalJava era una precedente implementazione di Java per dispositivi mobili, basata su Java 1.1. Non è direttamente collegata a JavaME. Tuttavia il Personal Profile prende il posto lasciato vuoto da PersonalJava. -
Ho fatto il porting di una KVM/CVM per qualche piattaforma. Posso distribuirla/venderla?
Quando scaricate l'implementazione di riferimento (RI), aderite alla licenza Sun Community Source, che vi proibisce di distribuire codice sorgente per implementazione di riferimento. Potete distribuire soltanto gli eseguibili per motivi di valutazione e non potete vendere la Virtual Machine di cui avete fatto il porting. -
Quali sono i campi minimi che devono essere presenti nel MANIFEST di una MIDlet?
Il manifest deve contenere almeno i seguenti campi:
MIDlet-Name *
MIDlet-Version *
MIDlet-Vendor *
MIDlet-# (dove # è il numero della MIDlet, nel caso di MIDlet suite)
MicroEdition-Profile
MicroEdition-Configuration
* Questi valori devono essere esattamente uguali a quelli presenti nel file JAD. -
Quali sono i campi minimi che devono essere presenti nel JAD?
Un JAD (Java Application Descriptor) deve contenere almeno i seguenti termini:
MIDlet-Name *
MIDlet-Version *
MIDlet-Vendor *
MIDlet-Jar-URL
MIDlet-Jar-Size
* Questi valori devono essere esattamente uguali a quelli presenti nel manifest. -
Ho sentito il termine J2ME, ma non JavaME. Cosa è JavaME?
Al JavaOne 2005, Sun ha anunciato una nuova convenzione sui nomi per le tecnologie Java. Con questo cambiamento le tecnologie Micro Edition sono stata rinominate in JavaME, levando il "2" nel nome per evitare confusione nei consumatori e far crescere false aspettative per futuri J3ME. -
Dove posso trovare il sito degli sviluppatori e le SDK di XXX?
Ai seguenti link è possibile trovare informazioni rispettivamente su siti e SDK
Gruppi di discussione
SDK -
Come posso fare un gioco? Ho bisogno di imparare Java prima?
Si, imparare Java per fare giochi e applicazione su device J2ME significa capire come funziona l'OOP, il Threading, la gestione della memoria, le eccezioni. J2ME non è una versione "leggera" di J2SE. Non è come il paragone tra VBA e VB. J2ME può essere un piccolo sottoinsieme delle API J2SE, ma il linguaggio, Java, e tutte le sue caratteristiche sono uguali in entrambi le piattaforme. -
Quali sono le differenze base tra sviluppare in J2SE e in J2ME?
- I dispositivi J2ME utilizzano una KVM (Kilobyte Virtual Machine) al posto di una JVM (Java Virtual Machine) a causa di restrizioni sulla memoria.
- Solo i package base delle API J2SE sono disponibili su J2ME e le classi di questi package hanno qualche metodo in meno.
- I package e le classi di J2ME sono state aggiunte per dare maggiore controllo sulle risorse dei dispositivi.
- API opzionali o legate al produttore sono disponibili per permette un maggiore controllo su un particolare modello di dispositivo.
- Lo scheduling dei Thread sui dispositivi con capacità limitate è gestito solitamente in maniera esclusiva, ovvero un Thread può occupare la CPU, non permettendo ad altri Thread di andare in esecuzione. In J2SE lo scheduling avviene in maniera preemptiva, ovvero permettendo ad ogni Thread un pò di tempo di esecuzione della CPU. Settare la priorità dei Thread, in entrambi li ambienti, non garantisce che un Thread avrà maggiore tempo rispetto ad un altro.
- I dispositivi J2ME non ha un grande filesystem. Vengono utilizzati i RecordStore per immagazzinare semplice stream binari. Tipicamente piccole quantità di dati, come punteggi, preferenze vengono salvati in questi store. -
Quanto Heap, che dimensioni dello schermo, che versione di MIDP o CLDC ha un certo dispositivo?
Ai seguenti link è possibile trovare informazioni dettagliate sui dispositivi -
Dove posso trovare informazione su una certa API per vedere se possibile fare una certa cosa con J2ME?
La lista delle JSR di J2ME che potete trovare al seguente indirizzo può darvi le risposte che cercate.
http://www.jcp.org/en/jsr/tech?listBy=1&listByType=platform
A questa pagina potete trovare una lista di JSR con la relativa descrizione
JSR -
Come posso sapere se il mio cellulare supporta una certa JSR?
Prima di tutto bisogna controllare sul sito dedicato agli sviluppatori del produttore. Se qui non vengono date queste informazioni allora ci sono i seguenti siti - Configurazioni
-
Quali sono i requisiti minimi per CLDC?
Un dispositivo per supportare CLDC deve avere come minimo:- Processore RISC/CISC 16/32 bit
- 160k di memoria (128k è per la Virtual Machine e le API)
- Qualche forma di connettività con la rete
-
Voglio/ho bisogno di usare dei metodi nativi. Come posso farlo?
Non potete. JNI (Java Native Interface non è disponibile con la KVM). Qualcuno potrebbe utilizzare KNI come alternativa. Questa tuttavia è una risposta sbagliata e non è una soluzione. KNI (K Native Interface) è un layer specifico della SUN, introdotto nell'implementazione di riferimento per MIDP 2.0 e CLDC 1.0.4. Lo scopo di questo layer è quello di permettere i porting di queste e future implementazioni verso nuove piattaforme e non può essere usate per utilizzare codice nativo a runtime. -
CLDC supporta le operazioni in virgola mobile?
La specifica CLDC 1.0 non supporta la virgola mobile. Tuttavia questo supporto è stato introdotto nella specifica CLDC 1.1. Se dovete lavorare con una device che ha CLDC 1.0 e avete bisogno della virgola mobile potete scaricare ed utilizzare la libreria MathFP. -
Quali sono i requisiti mini per CDC?
Un dispositivo per supportare CDC deve avere come minimo:- Processore RISC/CISC 32 bit
- 2 Mega di RAM
- Qualche forma di connettività con la rete
- Profili
-
Cosa è MIDP?
MIDP definisce un insieme di API per device mobili, come cellulari e PDA di fascia bassa (i PDA di fascia alta possono beneficiare di pofili più potenti come il Personal Profile) -
Qual'è la versione corrente delle specifiche MIDP?
Attualmente ci sono 3 versioni di specifiche MIDP: 1.0, 2.0 e 3.0. La 1.0 fu il primo profilo rilasciato sotto il nome di JavaME nel 2000. La specifica 2.0 è stata rilasciata nel 2002, è compatibile con la precedente versione e risolve molti dei problemi della priam versione. La specifica 3.0 è stata rilasciata nel 2006 ed prevede notevoli migliorie. Attualmente ancora non è stata implementata su nessun dispositivo. -
Per cosa sta l'acronimo LCDUI?
Ci sono diverse interpretazioni per questo acronimo. Quella che sembra essere la più affermata lo interpreta come "Limited Connected Device UI". Altre interpretazioni sono "Liquid Crystal Display UI" e "Least Common Denominator UI". -
E' disponibile MIDP per Palm OS?
Nel Giugno 2003 Palm annunciò un'alleanza con IBM per il rilascio di WebSphere Micro Environment sulla propria linea di device Tungsten. Potete anche cercare MIDP4Palm, la prima versione di MIDP per la piattaforma Palm OS che attualmente non è più scaricabile dal sito SUN. Per maggiori informazioni vi rimando alla pagina con le JVM -
Posso accedere alla rubrica del mio PDA dalla mia MIDlet?
Non con MIDP. Tuttavia esistono delle API opzionali (PDA Optional Packages) che permettono di fare ciò. -
MIDP supporta le operazioni in virgola mobile?
Visto che MIDP è costruito sopra a CLDC vi consiglio di guarda la sezione relativa alle configurazioni -
Quando sarà disponibile il profilo PDA (Personal Digital Assistant)?
Il profilo PDA è ora chiamato PDA Optional Packages per la piattaforma JavaME e consiste di due separati optional package:- Personal Information Manager API: Permette allo sviluppatore di accedere alle informazioni native presenti sul dispositivo, come rubrica, calendario e todo
- FileConnection API - Viene data la possibilità di accedere al filesystem del dispositivo, interno e esterno (memory card).
-
Perchè non riesco a trovare nessuna classe grafica nel Foundation profile?
Il Foundation profile, quando viene utilizzato, è pensato per piccole device embedded. Ad esempio device che non hanno interfaccia grafica come router o gateway. Ci sono altri profili, come il Personal Profile, che sono stati pensati per funzionare sopra al Foundation Profile. -
Cosa è il Personal Profile?
Il Personal Profile è il rimpiazzo in JavaME per l'ormai "defunto" PersonalJava -
Che differenze ci sono tra Personal Profile e Personal Basis Profile?
Il Personal Basis Profile (JSR-129) definisce un minimo insieme di APi per l'interfaccia grafica. Il Personal Profile (JSR-62) è costruito sopra le API del Personal Basis Profile. Il Personal Profile è uno dei passi per la migrazione da PersonalJava e per questo ha bisogno di supportare tutte le API che erano disponibili su PersonalJava. Il Personal Basis Profile è invece pensato per device che hanno capacità leggermente minori rispetto a quello che supportano il Personal Profile. - Networking
-
Come posso comunicare con un server FTP, con un database, con www.server.com:XXX ?
Avete bisogno di un cellulare che supporti le SocketConnection. A questo punto la connessione con qualsiasi host remoto è possibile, bisogna certo vedere come può avvenire il dialogo. Ogni protocollo ha delle sue regole quindi dovete riscrivervi un modulo che permette la comunicazione (ad esempio una libreria FTP) oppure cercare se esiste qualcosa di OpenSource che fa al caso vostro. -
Come posso connettermi ad un database? Posso usare SQL?
JavaME non ha il supporto per SQL o per JDBC. Esistono tuttavia dei database per JavaME, per i quali vi rimando alla pagina con i tool. Se volete connettervi ad un database potete optare per una soluzione che si appoggia ad un server remoto (contattato in http, udp, https, socket) che gestisce le vere e proprie connessione al database. Su JavaME è possibile sfruttare l'RMS (Record Store Management), che vi permette di salvare array di byte sul dispositivo. -
In che linguaggio devo scrivere il mio server?
E' possibile scrivere il server, con il quale la vostra applicazione deve comunicare, in qualsiasi linguaggio. Se basate la comunicazione tra MIDlet e server sull'HTTP è possibile utilizzare tutti i linguaggi che permettono appunto di gestire richieste/risposte in HTTP (PHP,JSP,ASP,Perl etc. etc.) -
Perchè viene lanciata un'eccezione quando provo a connettermi ad un Web Services dall'emulatore WTK?
Probabilmente navigate dietro un proxy e questo limita le connessioni. Per risolvere il problema dovete riconfigurare il proxy in maniera tale da permettere la connessione. Se ad esempio il Web Service che state cercando di contattare è su una porta diversa da quella standard (80) allora dovete aggiungere questa porta nella configurazione del vostro proxy. -
Dove posso trovare la lista di access point GPRS per Internet e non solo per l'accesso WAP?
Al seguente indirizzo potete trovare una lista di diversi operatori nel mondo.
http://www.reqwireless.com/apns.html -
Posso mandare SMS/MMS dalla mia MIDlet?
Potete mandare SMS, a patto che il vostro dispositivo supporti la JSR-120, le WMA (Wireless Messaging API 1.0). Se il vostro dispositivo supporta la versione 2.0 di queste API allora siete in grado anche di inviare MMS. -
Quali numeri di porta posso usare per gli SMS (WMA) ?
In accordo con le specifiche 3GPP, il range di porte che è possibile utilizzare dalle applicazioni va da 16000 a 16999, quindi dovete utilizzare un numero di porta che rientra in questo range per le vostre applicazioni che utilizzano WMA. E' importante anche sapere che ci sono alcune porte in questo range che sono riservate (differenti da produttore a produttore). Ad esempio nelle device Sony Ericsson abbiamo:- 16733: Calendar Application
- 16987: E-Mail Notifications
- 16988: E-Mail Account Settings
-
Cosa è il Generic Connection Framework?
Il Generic Connection Framework è un paradigma utilizzato per creare oggetti javax.microedition.io.Connection, che supportano differenti protocolli. Un URI che definisce un protocollo e un end-point remoto per la connessione di rete è passato alla classe javax.microedition.io.Connector attraverso uno dei metodi open() e un oggetto del tipo javax.microedition.io.Connection viene restituito, pronto per connettersi all'end-point. -
Voglio creare una connessione TCP/UDP/XYZ con un server. Posso farlo con MIDP?
Si, se il dispositivo supporta questa connessione. L'unico protocollo richiesto è l'HTTP, ma il produttore può fornire altri protocolli. -
Come posso creare un Server Socket con GCF?
Non puoi. Con GCF non c'è supporto per le Server Socket. Tuttavia puoi creare un istanza di javax.microedition.io.StreamConnectionNotifier e invocare il metodo acceptAndOpen(). Il seguente esempio mostra come farlo:
public void waitForConnection() { // cambiate la porta con quello che volete
StreamConnectionNotifier server =
(StreamConnectionNotifier)Connector.open("serversocket://:10000");
StreamConnection conn = server.acceptAndOpen();
// fate qualcosa con questa nuova connessione
} -
Posso chiamare un numero di telefono dalla mia MIDlet?
La specifica di MIDP 1.0 non fornisce nessuna API per fare ciò. Il produttore è libero però di aggiungere profili aggiuntivi che permettono di farlo. La specifica di MIDP 2.0 include nella classe javax.microedition.midlet.MIDlet il metodo platformRequest(String). Il numero di telefono può essere passato nella forma tel:come definito nell'RFC 2806 -
Posso determinare il numero di telefono dalla mia MIDlet?
La specifica di MIDP 1.0 non fornisce nessuna API per fare ciò. Il produttore è libero però di aggiungere profili aggiuntivi che permettono di farlo. La specifica di MIDP 2.0 include nella classe javax.microedition.midlet.MIDlet il metodo platformRequest(String) che può essere utilizzato dai produttori per fornire questa informazione hanno deciso di farlo. -
Quando sto utilizzando connessioni HTTP, ricevo il messaggio 'java.io.IOException: exceeded the configured maximum number of connections'. Perchè?
La risposta coinvolge gli oggetti java.io.InputStream e java.io.OutputStream legati all'oggetto javax.microedition.io.HttpConnection che state utilizzando . Se stato usando gli stream di input e output, è necessario che li chiudiate una volta che avete finito di utilizzare la connessione. E' possibile altrimenti che la sottostante implementazione lasci appesa la connessione javax.microedition.io.Connection. Dovete semplicemente richiamare il metodo close() su tutti gli stream relativi alla connessione e il problema si dovrebbe risolvere. Dovete anche essere certi di non utilizzare connessioni persistenti se state dialogando con diversi server nella vostra applicazione. -
Posso determinare l'ip del mio dispositivo con la mia MIDlet?
No. Non tutti i dispositivi MIDP utilizzano un networking basati su IP e l'expert group di MIDP ha deciso di non includere un API per determinare l'indirizzo delle device proprio per questo motivo. -
Come posso realizzare connessioni HTTP persistenti con un server?
In HTTP 1.1 le connessioni persistenti sono il comportamento di default richiesto dalle specifiche. Quindi non è richiesto nessuno strano meccanismo per far capire al dispositivo che la connessione deve essere mantenuta tra diverse richieste HTTP. Vedete la prossima domanda per sapere come evitare l'utilizzo di connessioni persistenti. -
Come posso dire al dispositivo che non voglio mantenere persistenti le connessioni?
Quando stare creando l'oggetto connessione, dovete settare la proprietà "Connection" al valore "close". Questo dirà al server di uccidere la connessione dopo che la risposta è stata inviata.
HttpConnection conn =
(HttpConnection)connector.open("http://foo.com/index.jsp"); conn.setRequestProperty("Connection","close"); -
Posso riutilizzare lo stesso oggetto HttpConnection più di una volta?
No, non potete utilizzare lo stesso oggetto più di una volta. L'oggetto HttpConnection rappresenta esattamente una connessione con il server e non può essere utilizzare per trasmettere dati più di una volta. L'oggetto connessione può esistere in uno dei seguenti 3 stati:- Instaurazione
- Connesso
- Chiuso
- Grafica
-
Posso creare nuovi elementi da aggiungere alle Form?
In MIDP 1.0 non è possibile. Come dicono le specifiche, javax.microedition.lcdui.Form ha solo delle API per appendere elementi, usando un istanza di String (StringItem), Image (ImageItem) o Item. Non c'è possibilità di creare una nuova sottoclasse di javax.microedition.lcdui.Item, visto che l'unico metodo astratto, paint(), è protetto. In MIDP 2.0 è stata introdotta la classe javax.microedition.lcdui.CustomItem. Estendendo questa classe è possibile creare un proprio elemento da aggiungere alle Form. -
Posso creare un Image da un array di byte. Posso recuperare l'array di byte da un Image?
Sfortunatamente no. Non esiste un API per estrarre niente da un'immagine oltre altezza, larghezza e l'oggetto Graphics. Con MIDP 2.0 si possono ottenere i raw byte utilizzando il metodo getRGB() di Image. -
Come posso avere la notifica di eventi della tastiera con una Form, TextArea o List in MIDP?
Le API delle interfacce grafiche ad alto livello nel package javax.microedition.lcdui non danno accesso agli eventi di basso livello della tastiera. Questi eventi sono disponibili solo nelle classi che estendono Canvas. Esiste un'alternativa, anche se è differente da quello che viene richiesto. L'interfaccia javax.microedition.lcdui.ItemStateListener definisce un contratto per gli oggetti che verranno notificati dei cambiamenti di stato all'interno di un oggetto javax.microedition.lcdui.Form. Tuttavia non esiste uno specifico insieme di condizioni sotto le quali queste notifiche verranno inviate. E' a discrezione del produttore di decidere quando e se le notifiche verranno inviate. Le notifiche così possono cambiare da device a device e da produttore a produttore. -
Posso sottolineare il testo nella mia TextField o in un TextBox, o in una StringItem contenuta in una Form?
No. Non c'è possibilità di sottolineare il testo visualizzato in queste componenti. -
Posso assegnare oggetti Command a specifici soft key?
No, non è possibile. Quando crei un istanza di Command, puoi specificare soltanto la label, il tipo di comando e la priorità. L'implementazione di MIDP usa il tipo e la priorità dei comandi che devono essere visualizzati per determinare come i comandi verranno presentati all'utente. Verrà anche fatto un'ottimizzazione nel decidere il bottone appropriato per quella device. Ad esempio se il dispositivo visualizza normalmente i bottoni "OK" sulla destra, allora verranno visualizzati a destra tutti comandi con il tipo uguale a Command.OK. Inoltre non tutti i MIDP hanno delle softkey. Ad esempio il Blackberry della RIM visualizza i comandi come elementi di un menu. Su queste device non c'è il concetto di softkey. Su questi tipi di device verrà utilizzato il concetto di priorità per raggruppare in maniera ordinata i comandi, quindi definite sempre una priorità unica per ogni comando. -
Quando avvio la mia MIDlet nell'emulatore, le immagini si caricano normalmente. Quando poi provo la MIDlet sul dispositivo le immagini non vengono visualizzate.
Verifica che l'immagine sia presente nel file JAR e che abbia lo stesso path che richiamate da codice. Se non viene utilizzato lo stesso path, quando andate a creare l'immagine con Image.createImage("/foo.png"), vi verrà restituito un IOException. Ricordatevi inoltre che i nomi sono case sensitive e che devote utilizzare tutto il nome dell'immagine, comprensivo di estensione. -
Voglio visualizzare uno schermo "Attendere prego..." mentre eseguo un processo lungo (network ad esempio), ma lo schermo di attesa non appare mai e dopo che il processo è finito appare. Cosa c'è di sbagliato?
Sicuramente stai bloccando il thread principale, che è quello che deve aggiornare lo schermo. Questo è lo stesso thread che richiama tutti i metodi di input (come commandAction() o keyPressed()), così se vuoi eseguite un processo lungo in questo thread, lo bloccate e non c'è possibilità che lo schermo venga aggiornato. Per fare questo tipo di operazioni dovete assegnarle ad un thread separato. -
Come posso mettere una Canvas dentro una Form o usare gli elementi grafici di alto livello con una Canvas?
Purtroppo non è possibile. -
Perchè quando la mia applicazione, utilizzando myDisplay.setCurrent(nextCanvas), cambia tra diverse canvas io non le vedo?
Probabilmente state facendo qualcosa di simile al codice seguente:
myDisplay.setCurrent(canvas1);
qualcheFunzioneCheUsaLaCanvas1();
myDisplay.setCurrent(canvas2);
Questo non funziona perchè la funziona ritorna sempre istantaneamente e il Display viene aggiornato quando la KVM vuole. Inoltre non è una buona abitudine utilizzare Canvas multiple. Ci sono problemi di memoria nell'utilizzare molte Canvas. Utilizza una sola Canvas con differenti stati e visualizza le corrette informazioni per ogni stato. - Sicurezza
-
Posso caricare una classe che si trova fuori della mia MIDlet suite?
No. La MIDlet può soltanto caricare classi che si trovano all'interno della sua stessa suite. Questo non permette agli utenti smaliziati di caricare classi pericolose. Inoltre previene anche il caricamento di classi OTA (Over The Air) che sicuramente comporterebbe uno spreco di banda. -
Come posso rimuovere i fastidiosi permessi che vengono richiesti all'utente?
Soltanto certificando l'applicazione che state sviluppando è possibile rimuovere questi popup. Per maggiori informazioni consultate i seguenti siti:
http://www.javaverified.com/
http://www.verisign.it/
http://www.thawte.com/ - Runtime
-
Come posso leggere un file dentro il JAR?
Per leggere un file che si trova dentro il vostro JAR basta utilizzare l'API java.lang.class.getResourceAsStream(), passando come parametro il path del file. -
Come posso dire al mio dispositivo di far partire la mia MIDlet quando avviene qualcosa?
Con MIDP 1.0 non c'è possibilità di lanciare automaticamente una MIDlet sia all'avvio che quando viene ricevuto qualche dato. In MIDP 2.0 c'è il concetto di Push Registry, che permette ad una MIDlet di registere se stessa per un attivazione che si basa su eventi timer o derivanti dalla rete. Date un'occhiata alla classe javax.microedition.io.PushRegistry nella documentazioen Javadocs per avere maggiori dettagli sul funzionamento del Push Registry. -
Cosa accade ai miei thread quando la MIDlet viene sospesa?
Sulla maggior parte dei dispositivi l'unico thread che viene sospeso è quello principale per la MIDlet. Altri thread che sono partiti con la MIDlet dovrebbero continuare a funzionare (non su tutte le device). -
Quali proprietà di sistema sono disponibili per determinare il tipo di dispositivo a runtime?
Le seguenti proprietà di sistema sono disponibili, in MIDP 2.0, per aiutare a determinare la tipologia di device sulla quale la MIDlet sta funzionando:
- microedition.platform : Identifica il tipo di dispositivo o ritorna null se il valore non è definito
- microedition.encoding : Il default encoding
- microedition.configuration : La configurazione che questo dispositivo ha implementato
- microedition.profiles : I profili che questo dispositivo ha implementato
- microedition.locale : Il Locale per questo dispositivo. Questo valore può essere null
http://developers.sun.com/techtopics/mobility/midp/questions/properties/ -
Vorrei avere informazioni di localizzazione fisica del mio dispositivo. E' possibile?
Per avere queste informazioni il tuo dispositivo deve supportare le Location API. Con questo package opzionale puoi avere queste informazioni a runtime. Se il produttore non ha implementato questa API sul tuo dispositivo, non c'è modo di determinare la posizione fisica del tuo dispositivo. -
Cosa significa l'errore "Unable to create MIDlet SimpleGame java.lang.ClassNotFoundException: SimpleGame"?
Nel 99% dei casi questo errore è dovuto ad un errore nel fild JAD. La linea "MIDlet-1" ha bisogno di contenere il nome completo di package della classe che estende MIDlet. Ad esempio com.javastaff.j2me.HelloWorld - Sviluppo
-
Quali sono i tool di cui ho bisogno per iniziare a sviluppare?
Avete bisogno come minino di :- JDK versione 1.3 o maggiore
- L'implementazione di riferimento (RI) per il profilo che vi interessa
- L'implementazione di riferimento (RI) per la configurazione che vi interessa
- ANT
-
Come è un semplice file build.xml di ANT?
Vi raccomando di utilizzare la suite di task ANT Antenna, nella quale potete trovare la maggiorparte di task che servono durante la programmazione J2ME. -
Dove posso trovare le varie implementazioni di riferimento (RI) per le configurazioni e i profili di J2ME?
-
Quale è l'equivalente del "Hello World" in J2ME (MIDP)?
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
public class HelloWorld extends MIDlet implements CommandListener {
public HelloWorld() {
}
public void startApp() {
Form form = new Form("Hello world!");
form.addCommand(new Command("Exit",Command.EXIT,1));
form.setCommandListener(this);
Display.getDisplay(this).setCurrent(form);
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c,Displayable d) {
if(c.getCommandType() == Command.EXIT) { notifyDestroyed();
}
} } -
Quando provo ad offuscare la mia MIDlet, RetroGuard muore. Perchè?
E' un problema con l'offuscamento in Java. La maggior parte degli offuscatori iniziando ad alterare il bytecode passando per i vari metodi e classi utilizzate nella vostra MIDlet e dopo esaminano i metodi e le classi utilizzati da questi metodi per offuscare il codice. Quando RetroGuard trova un metodo nativo (per esempio un metodo presente nelle API MIDP che è implementato nella KVM e non nel codice), non può gestire questa situazione e ritorna un errore. Se state usando, nel vostro classpath per RetroGuard, uno zip o una sottodirectory che contiene una versione funzionante delle API MIDP, RetroGuard trova uno o più riferimenti allo stesso metodo nativo e per questo fallisce. La soluzione è utilizzare il file emptyapi.zip, che viene fornito insieme al Wireless Toolkit. Questo archivio fornisce tutte le interfacce pubbliche utilizzate dal profilo MIDP senza alcun implementazione o riferimento al codice nativo. -
Quando preverifico le mie classi mi viene restituito l'errore "Class loading error: Bad major version number". Perchè?
Penso che stiate utilizzando una JDK 1.4 o maggiore. Il problema è che il formato del byte code generato dalla 1.4 (e successive) è incompatibile con le versioni precedenti dell'eseguibile che state utilizzando che effettua la preverifica. Per risolvere questo problema dovete aggiornare il vostro ToolKit all'ultima versione. Se state già utilizzando l'ultima versione o il produttore del tool che utilizzate non ha aggiornato il programma potete utilizzare il seguente comando :
javac {ARGOMENTI} -target 1.1 {ALTRI ARGOMENTI}
Questo vi permettera di produrre del byte code precedente alla versione 1.4. Se state utilizzando la JDK 5.0 dovrete invece utilizzare la seguente riga di comando:
javac {ARGOMENTI} -source 1.2 -target 1.2 -
Come posso usare JDWPI per effettuare il debug di una MIDlet all'interno dell'emulatore del Wireless Toolkit?
Per accedere all'emulatore utilizzando le socket, dovete avviarlo e includere il seguente argomento nel comando d'avvio (bat o sh)
-Xrunjdwp:transport=dt_socket,address=[PORTA],server=y,suspend=y
mettendo al posto di PORTA il numero di porta che volete utilizzare. Dopo dovete dare lo stesso numero al debugger per connettersi all'emulatore. Per accedere all'emulatore utilizzando la memoria condivisa, avviate l'emulatore specificando non la porta ma il nome della pagina di memoria condivisa utilizzando il seguente argomento
-Xrunjdwp:transport=dt_shmem,address=[PAGINA],server=y,suspend=y
sostituendo PAGINA con un nome. Dopo date lo stesso nome al debugger. -
Come posso aggiungere immagini e altre risorse al mio progetto nel Wireless Toolkit?
Copiate i file che vi occorrono nella sottodirectory "res" del vostro progetto. Dal codice potete riferirvi a questi file utilizzando il path "/res/FILENAME". - Installazione
-
Come posso scaricare la mia MIDlet su un cellulare o su un dispositivo mobile?
Dipende dal dispositivo in questione. Esistono due metodi in generale:- Installazione Over-the-air (OTA)
- Installazione via cavo
L'installazione via cavo deve essere supportato dal device, ovvero il produttore deve fornire un programma per installare l'applicazione. In alternativa è possibile installare, su alcuni dispositivi, tramite Bluetooth. -
Quali sono i tipi MIME per i file JAR e JAD?
Per poter distribuire le MIDlet con un web server, questo deve essere configurato con i giusti tipi mime.
FILE ESTENSIONE MIME TYPE JAR .jar application/java-archive JAD .jad text/vnd.sun.j2me.app-descriptor
Per aggiungere questi valori in Apache2, dovete aggiungere le seguenti righe nel file /etc/apache2/apache2.conf:
AddEncoding application/java-archive jar
AddEncoding text/vnd.sun.j2me.app-descriptor jad -
Ricevo il messaggio "invalid file" quando provo ad installare la mia MIDlet. Qual'è il problema?
Ci sono diversi potenziali cause per questo problema:- Vi state dimenticando di inserire i giusti attributi nel file JAD
- La versione di MIDP e/o CLDC specificati non sono supportati dal dispositivo
- Gli attributi che avete inserito nel JAD e nel MANIFEST non corrispondono. Controllate i file con un editor esadecimale per essere sicuri che non ci siano caratteri speciali
- Una o più classi che sono riferite nella vostra MIDlet non vengono trovate nel dispositivo. Ad esempio se utilizzate delle API opzionali che il dispositivo non ha implementato
- Il valore di MIDlet-Data-Size eccede il massimo valore per quel dispositivo
-
Come posso aggiornare automaticamente la mia MIDlet?
Utilizzando MIDP 1.0 non esiste una soluzione pratica. Con MIDP 2.0 è possibile il seguente escamotage. Dovete utilizzare l'API
platformRequest("http:/// ")
Se il file JAD indica una nuova versione allora il dispositivo vi richiederà di aggiornare la vostra applicazione, utilizzando il browser wap. Tuttavia non è possibile utilizzare questo meccanismo su tutti i dispositivi, quindi vale la pena testarlo prima. - Gestione della memoria
-
Cosa è la Garbage Collection?
La Garbage Collection è un servizio che viene fornito dalla JVM per richiedere la memoria che è stata individuata per essere ripulita. In Java, e quindi in J2ME, viene adottato questo meccanismo. -
Qual'è l'equivalente Java di delete?
A differenza di C/C++, linguaggi che permettono al programmatore il diretto accesso agli indirizzi di memoria e lo rendono responsabile dell'allocazione e la deallocazione della memoria, Java nasconde l'indirizzo degli oggetti allocati e non offre al programmatore un metodo diretto per deallocarli. -
Cosa succede quando richiamo System.gc()?
Non c'è una risposta definitiva a questa domanda. La JVM/KVM non è obbligata ad eseguire la Garbage Collection. La JVM/KVM può decidere di eseguire la Garbage Collection anche se non è stato richiamato System.gc(). Il tutto dipende dall'implementazione della singola Virtual Machine. -
Quando avviene la Garbage Collection, cosa succede?
Anche in questo caso non c'è una risposta definitiva. -
Come posso essere sicuro di rendere un oggetto idoneo per la Garbage Collection?
Semplicemente bisognare avere meno riferimenti possibili a quell'oggetto. Un buon approccio è quello di utilizzare il pattern Singleton, avendo un "Reference Manager" che gestisce l'oggetto. In questo caso basta semplicemente mettere a null l'oggetto e quindi si è sicuri che l'unico riferimento ad esso non esiste più e l'oggetto è pronto per la Garbage Collection. -
Come posso evitare che il mio oggetto sia idoneo per la Garbage Collection?
Nel metodo finaliza della class dovete assegnare un riferimento esterno all'oggetto prima che questo sia rimosso. Questo funzionerà solo la prima volta che viene tentata la finalizzazione dell'oggetto, visto che il metodo finalize viene richiamato una volta sola. -
Quando scrivo a schermo un oggetto ottendo qualcosa del tipo Object@345563. E' l'indirizzo dell'oggetto?
No è semplicemente il reference ID dell'oggetto. Aiuta la JVM a recuperare l'istanza dell'oggetto. Ogni JVm decide come implementare questo ID. E' possibile utilizzare questo ID per testare se due riferimenti puntano allo stesso oggetto (a == b). -
Come posso gestire gli OutOfMemoryErrors?
In teoria non c'è molto che potete fare. Questi errori, al contrario delle eccezioni che vengono gestite, non possono essere controllati dal programma. Avviene quando superate il limite di memoria a vostra disposizione. L'unica cosa che potete fare è cercare di individuare all'interno del vostro codice i punti critici che portano a questo tipo di errore e modificarli.
Traduzione e riadattamento effettuati a partire dalle seguenti FAQ:
http://bellsouthpwp.net/m/c/mcpierce/javamefaq.html
http://www.j2meforums.com/wiki/index.php/FAQ
Il Copyright di questi testi appartiene ai rispettivi proprietari