[ITA] arduino forum app test/development

sì, è un progetto di eclipseSDK...

il .zip è veccio, bisogna usare il .rar ora controllo che non sia corrotoo ma in casoè un problema perchè il PC l'ho lasciato a lavoro...uffi

edit: bhe per ora guarda lo zip, ti fai un'idea di come si usa la grafica. da notare che attraverso il pulsante posso aggiungere elementi.. quì il discorso è complesso.

Una App (ma tutto ciò che è grafico di solito) gira di base in un suo "thread UI".
Questo thread si occupa di gestire gli eventi, che non sono altro che interrupt lato software. In pratica se tut fai qualcosa tipo un tocco, il SO andorid legge l'evento, lo pre-elabora, lo da in pasto al thread UI dell'applicazione in fullscreen (non è detto che sia sempre così, devo ancora studiare), e il thread UI lo da in pasto all'eventuale listener(ascoltatore di eventi) associato.

Un listener è un interfaccia (quindi un qualcosa che ti obbliga a credare delle funzioni con determinati paramentri, equivalentio alle fuinzioni di interrupt), quindi la tua classe diventa ANCHE (puoi avere più interfaccie) una classe di TIPO interfaccia, e a questo punto puoi fare applicazione.addListener(classeInterfaccia);

PROBLEMA: se blocchi il thread UI blocchi anche l'interfaccia grafica e la gestione degli eventi (ES i bottoni non funzionano... capita anche con i programmi PC, mai fatto caso?)
i signori della android, hanno avuto un ottima idea; se il thread UI rimane impallato per più di 5 secondi, l'app viene vista cone non responsiva.

Even worse, if the UI thread is blocked for more than a few seconds (about 5 seconds currently) the user is presented with the infamous "application not responding" (ANR) dialog.

(il procedimento è uguale alle applicazioni swing di java e di tutti gli altri linguaggi e grafica non credere, sto semplicemente aggiungendo qualche info specifica da Processes and threads overview  |  App quality  |  Android Developers)

Quindi, ora cosa succede: quando premi il bottone, viene creato un thread a parte (vengono chiamati worker), che prende in input un url e un listener, e va per la sua strada.
Il listener è appunto una semplice interfaccia in cui ho definito 2 funzioni: setMessage(ArrayList di classe Messaggio che vredremo poi) e setError(String).
Ovviamente la classe Activity (la classe main, che poi è una FragmentActivity per mantenere la compatibilità con gli android 2.2, ma lo spiego poi), implementa il listener.

Quindi cosa succede? nulla, il thread grafico vive come se nulla fosse, intanto il worker apre la URL, scarica il contenuto della pagina, lo converte byte per byte in UTF8 (quindi NON ASCII, in teoria il server risponde con l'encoding, o meglio il charset, della pagina, ma non uso questo dato per ora), poi dall'HTML con i tag sopra estrae per ogni mesaggio i vari dati, e crea quindi l'array di classe messaggio.

La classe messaggio non solo contiene i dati, ma in realtà è un Fragment, una cosa che usa andorid apposta per fare grafiche molto dinamiche...

ora, quando i dati sono caricati, il worker non fa altro che listener.setMessage(array di messaggi), ed ecco che alla nostro listener arrivano i messaggi MA siamo ancora nel thread worker...

e il thred UI non è thred safe, ciò vuol dire che se lo modifichi da altri thread senza prenderele giuste e complesse precauzioni fai solo (grossi) casini.

Nel mio caso i fragment hanno qualche sbattimenro grafico ma più o meno funzionano,o ma la cosa mi dava problemi era in caso di errore (setError) veniva creata un AlertBox dal thread worker e faceva crashare tutto...

ora ci sono vari metodi ad esempio mettere i dati in una variabile, e poi intercettare un eveto del thredUI che controllo se i dati co sono/sono cambiati e fa la parte grafica...

ma ci sono già le soluzioni precoinfezionate_

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

e ancora meglio la classe AsyncTask, che ti da 2 metodi:
doInBackground, che è chiamata dal "thread worker" e
onPostExecute, che è eseguita dal "thread UI"
Notare che in pratica è il sistema di parcheggiare i dati in una variabile vista da entrambi i Thread, solo che anzichè come nel mio caso ricevere eneti solo dal Wroker, riceve eventi anche dal UI, e quindi "fa da ponte"

niente, anche il .rar e' corrotto

ma il plugin ADT google lo stai usando ?

(ri) caricato nel primo post il .rar!
da quì funziona, spero anahce a casa......

edit: sì, ho scaricato il SDK pack che ti da eclipse già modificato e funzionante... e me lo tengo ben separato da eclipse che uso per il java classico e quello che uso per il c/c++ :slight_smile:

comunque sbasta che derarri la cartella, e poi da eclipse SDK o con plugin ADK fai destro -> importa -> progetto into workspace

News: nonostante loff line grazie a google cache ho proseguito ieri notte.
Non posto il codice perché non funziona bene, ma in pratica ho aggiunto l'elenco delle biard principali.
Corretti un paio di bug uppo, poi aggiungo la visualizzazione dei forum ed infine sistemo quella dei messaggi per seguire il muovo sistema.
In pratica le fragment ora le uso per le viste a tutto schermo, mentre le liste non sono più liste di fragment ma liste normali, così scorrendole uso sempre le stesse 2 o 3 view riciclate.
mi piace android, è ben architetturato ed ottimizzabile... Per ora i tempi di caricamento da internet influiscono tantissimo, il mio codice è una scheggia :); anche se provato su una virtual machine, litighero col cell quando sarà stabile.

Proseguito ancora un pò...

prima visulizzavo tutte le board principali di seguito, ora invece sono espandibili, divise secondo i titoli (parlo della pagina Arduino Forum), il codice che invcece le mostrava tutte di fila è stato mantenuto e sarà utilizzato per mostarre invece il contenuto delle board (l'elenco dei topic per intenderci).
Quindi c'è da sistemare il parser per mostrare i topic (casi speciali da aggiungere: sotto-topic, che userà un sistema a loop, e topic "sticcati").
poi c'è da riscrivere quello dei meggaggi per usare una list invece che un fragment per messaggio (le view possono essere riutilizzate al volo, quindi non hai mai più di 5 o 6 view in memoria invece che decine di fragment), da sistemare il fatto che carica una paginaalla volta (voglio caricarle tutte in parallelo, o meglioprima la pagina richiesta e poi le eventuali altre in parallelo), aggiungere il tasto quote, modify e reply.
sistemare il listener clonandolo o aggiungendo oltre all'url da caricare quale fragment utilizzare.

Quindi in pratica:
Fragment LOGIN (da fare)
Fragment BOARD (OK)
Fragment TOPIC (da adattare, diciamo 50%)
Fragment MESSAGGIO (da riscrivere, diciamo 20%)
Fragment POST/EDIT (da fare)

in allegato lo stato attuale, prossima volta faccio anche degli screen-shot

NewArduinoForum.zip (1.1 MB)

Lesto stai tenendo in considerazione il pulsante piu' importante di tutto il forum ?
REPLIES in alto a destra :smiley:

io lo metterei visibile in tutte le schermate, senza Replies e' impossibile seguire questo forum e mi dispiace che non venga tenuto in considerazione, ricordo in un topic che nemmeno Banzi sapeva di cosa parlavo :slight_smile:

c'è, c'è (da fare)

Fragment POST/EDIT (da fare)

se intendi qualcosa di simile senza postare non so, perchè non uso DB e voglio tenere l'app leggera... Al massimo faccio una specie di segnalibri per i topic

Tu usi il tasto replies normalmente? Se lo premi ti appare una schermata con tuttii topic a cui hai risposto ma solo se hanno ricevuto controrisposta
Quindi nella app metterei un bottone, un segnalibro,un menu, non so decidi tu, che premuto mi faccia vedere lo stesso risultato

ah sì, è il tasto "unread replies" okok, sì, lo uso, e lo metterò.
In oltre se ci fai caso se sui topixc èremi sul + sul forum, compare la pagina con i topic che hanno avuto modifiche dall'ultima volta che hai aperto la board.

Il codice della app è già predisposto per riconoscere il click sul + o sul nome del tipic.

o meglio per errore ho usato onTouch invece che onClick, ma si risolveion fretta

edit: wow. oltre 700 visite... mi sa che la cosa interessa assai

bene bene, si procede.

Oggi aggiunta la navigazione di board e topic, da aggiungere i sotto-Topic.
I topic lanciano già l'evento con il corretto URL sia per leggere il topic che per leggere il topic a partire dai nuovi messaggi.
Invece per le board l'url per vedere i nuovi topic è null perchè non la estraevo (speravo di riuscire a farne a meno).
Poi ci sarebbe un minimo di restailing grafico...

allego, come promesso, gli screen-shot, ed uppo il workspase nel primo post

Quindi
Fragment LOGIN (da fare)
Fragment BOARD (da aggiungere URL unread topic, diciamo 90%)
Fragment TOPIC (OK)
Fragment MESSAGGIO (da riscrivere, diciamo 20%)
Fragment POST/EDIT (da fare)
Fragment UNREAD REPLIES (da fare)

principale1.png

principale2.png

topic1.png

topic2.png

uppo anche il workspace, in modo da creare un diario di tutti i workspace utilizzati..

NewArduinoForum2013-2-26.zip (1.1 MB)

tracata la formichina prosegue :slight_smile:

allora news: il simbolo - scompare, ingigantendo lo spazio per il nome delle board/topic, ma compare il + (quindi il bottone pervisualizzare direttamente i nuovi topic... pagina non testata per mancanza dinuovi topic a quest'ora :frowning: )

il bello che il suddetto coidice per le unread dovrebbe funzionare anche per le sotto-sezioni... che però devo ancora implementare, quindi anche quì non testato :frowning:

mi apsetto che funzioni anche con il tasto "unread replies" (che mi accorgo ora essere solo replies, sorry testato, ecco perchè non ci capivamo), anche quì non siscuro per mancanza di nuovi post da quando ci ho pensato e per la mancanza di un tasto "leggi unread", che pensavo di nascondere nel menù (ma selezionabile come "homepage"), per lasciare tutto lo spazio all'elenco board/topic/messaggi

infine ho sistemato un pò il gestore di eventi, unificandolo.

al solito allego un paio di screen-shot e il workspace, che aggiorno anche nel primo post.

principaleNew1.png

topicNew.png

NewArduinoForum27-2-2013.zip (1.11 MB)

Complimenti lesto bell'iniziativa ho ababdonato la programmazione andorid qualche tempo fà ho pubblicato giusto qualche app sul market poi mi sono ritirato per impegni lavorativi, se ti serve una mano per la gestione DB no problem :wink:
Programmo nei più svariati linguaggi da anni, purtroppo lavorativamente non sono mai stato nel campo web(solo grandi aziende quindi fatturazione etc etc), da quanto ho letto nella prima pagina tu sfrutti i tag presenti nel codice per leggere le varie parti che ti interessano, immagino che hai studiato un pò l'html del forum e l'hai sfruttato in questa maniera, ma di conseguenza basta che il forum venga aggiornato o la struttura cambiata o anche solo il nome di un tag variato che ti si sballa tutta l'app giusto?
(sto studiando un pò per conto mio la programmazione web per ora solo php, css e javascript)

ps potresti aggiungere un DB, e magari salvare le discussioni che uno si vuole rileggere o anche solo i topic, o anche solo segnalibri, ti assicuro che sqllite è leggero e si usa facilmente :wink:

hai ragione su tutta la lina riguardo all'interpretazione dell'HTML. però dato che ogni tipologia di pagnia (elanco board, elenco topic, elenco messaggi, elenco unread) al suo interno è identica, ho 4 classi parser che fanno solo quello, quindi sono facili da aggiornare senza rompere il resto.

Per quanto riguarda i DB hai parzialmente ragione, ma un DB sarebbe "un overkill", ovvero una pesantezza inutile, meglio un sistema su file di testo.
Tanto non abbiamo da gestire accessi simultanei, essendo la app unica, in oltre se si fa che ogni tipic è un file di testo e la struttura board/sottoboard fatta con cartelle, viene fuori un sistema più vicino alla realtà e in grado di visualizzar in parallelo due topic senza problemi.
Anche l'aggiornamento non ha problemi: leggi il testo e lo mostri a video, contemporaneamente fai partire l'asyncTask che aggiorna TUTTI i mesaggi (per via degli edit..), poi alla chiusura del Fragment sovrascrivi il file di testo con lo stato attuale.

Infine ogni tot cancelli i file più vecchi di X e le cartelle vuote. easy no?

Al momento però è una cosa "forse la faccio"; salvo discussioni di più pagine, in cui sarebbe utile, comunque dovrei scaricarmi tutta la pagina e parsarla... senza contare il problema che stai leggendo qualcosa che magari nel frattempo è stata editata/modificata.

per ora preferisco sprecare banda in favore della "freschezza" dei dati, tanto ormai non c'è quasi più nessuno a consumo.

vabbè era solo per capire come si lavora sul web, anche io faccio spesso aprsing quindi capisco la facilità di ristrutturazione in caso di modifiche del forum.
forse hai ragione per i topic nei file di testo sarà che programmo su database da anni e ci faccio davvero di tutto quindi cerco di piazzarli ovunque, comunque per memorizzare impostazioni utente è perfetto un db, altrimenti ci sono le shared(non mi ricordo lo ammetto) che creano un area di memoria dove salvare delle impostazioni.
magari quando ho un pò di tempo ci do un occhiata e vedo di darti una mano, mi paicerebbe lavorare su web o/e app, almeno il risultato è più concreto.

sì, capisco, anche io all'inizio avevo questa tendenza... ma ora lvornado su file di 30/40GB a botta, mi rendo conto di quando rallentino le operazioni..

certo parliamo di tanti dati, ma su computer "normali", un andorid è un minipc e va in crisi con pochi dati

lesto:
sì, capisco, anche io all'inizio avevo questa tendenza... ma ora lvornado su file di 30/40GB a botta, mi rendo conto di quando rallentino le operazioni..

certo parliamo di tanti dati, ma su computer "normali", un andorid è un minipc e va in crisi con pochi dati

io ho lavorato anche su qualche miliardo di dati e ti assicuro che il db se ottimizzato al massimo rende bene, su android non saprei le prestazioni io ciò fatto solo piccole query(ho creato un gioco di enigmi e ho memorizzato all'interno, soluzioni, indovinelli, risposte e esiti.) .
wow 30/40gb :fearful:

il miliardo non l'ho ancora raggiunto :grin:, per ora uso molto meno di un paio di GB totali di spazio DB perchè i dati sono pre-analizzati da un programma che mette nel DB solo i dati utili (da quei 30/40GB giornalieri estraggo circa 5/10 milioni di righe ogni 14 giorni) (ma ho visto sistemi da miliardi di dati fare query select molto sotto il secondo...)

però ora che ci penso bene il vero problema non è l'elaborazione in sè, ma il peso di base del DB.. che però se è già in funzione perchè lo usa andorid di suo diventa nullo... quasi quasi...

lesto:
il miliardo non l'ho ancora raggiunto :grin:, per ora uso molto meno di un paio di GB totali di spazio DB perchè i dati sono pre-analizzati da un programma che mette nel DB solo i dati utili (da quei 30/40GB giornalieri estraggo circa 5/10 milioni di righe ogni 14 giorni) (ma ho visto sistemi da miliardi di dati fare query select molto sotto il secondo...)

però ora che ci penso bene il vero problema non è l'elaborazione in sè, ma il peso di base del DB.. che però se è già in funzione perchè lo usa andorid di suo diventa nullo... quasi quasi...

non volevo di certo costringerti ad usare un db però conoscendone le potenzialità volevo consigliartelo :grin:
eh si tieni conto che il rating di una grande società telefonica registra ogni singola chiamata quindi il miliardo di record si sfiora in relativamente poco tempo :grin:

Oggi poca roba...
gli algoritmi del parser sono da rivedere, mentre ora esttraggo un array di topic o di board, la soluzione ideale è estrarre UNA board o UN topic, poichè le pagine con le subboard hanno sia i tag per le board che per i topic, e per evere un parser unico...

c'è da rivedere il tutto in teoria, io ho diviso visualizzatore board e topic, in realtà sarebbe da fare una pagina sola con sopra le board e sotto i topic, e poi alimetarli in base a cosa ci si trova.

vabbè.. l'importante è che per ora sta in piedi. Se nessuno si diverte a immettere HTML nei messaggi/titoli.

ed ho aggiunto le sub-baord.

resta da testare il tasto unread-reples, credo risolvere un bug con l'elenco board che non rileva l'immagine per i nuovi topic, e fare fragment dei messaggi. poi passo al poter rispondere, posto il codice su github, e mi prendo una vacanza :stuck_out_tongue:

NewArduinoForum2013-02-28.zip (1.11 MB)