Autore Topic: dove lanciare un thread automaticamente  (Letto 671 volte)

Offline Alexofalco

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Advance
  • Sistema operativo:
    2.3.6
dove lanciare un thread automaticamente
« il: 11 Dicembre 2014, 11:22:05 CET »
0
Salve a tutti, spero di essere più chiaro e deciso possibile.

Ho un activity, una classe thread e una classe view. Lo scopo della mia applicazione è lanciare automaticamente il thread senza la presenza di un pulsante della interfaccia. Il thread si deve partire automaticamente ad avvio activity. Il thread principalmente fa operazioni di elaborazione immagini ma prima dell'esecuzione dello start devo lanciare un metodo di init dove prende come parametri iniziali le dimensioni finali della view customizzata, per ottimizzare le operazioni di scaling automatico.

Non so dove lanciare il thread. In onCreate ovviamente non sono state effettuate le operazioni di onMeasure e onLayout, fondamentali per ottenere le giuste width e height.
In rete suggeriscono di iniziare il thread nella cattura della rotazione, altri nell'invalidazione della activity. Sinceramente nessuna della mia ricerca ha dato come risultato finale una giusta motivazione quindi chiedo a voi più esperti di me di aiutarmi a capire dove e quando devono essere fatte questo tipo di operazioni senza stravolgere troppo o mettere toppe con soluzioni solo parziali.

Non riesco a credere che in android/java non ci sia un evento di segnalazione finale del inflater, dove poter mettere questo genere di operazioni. Ma sono sicuro che sono io a non riuscire a trovarlo nella documentazione.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:dove lanciare un thread automaticamente
« Risposta #1 il: 11 Dicembre 2014, 12:11:19 CET »
0
Non so la tua applicazione come sia, però se ad esempio puoi ricavare la tua View estendendo la SurfaceView, un pattern comune prevede di creare il thread di drawing sulla "surfacecreated" e distruggerlo sulla "surfacedestroyed".

Guarda questo esempio:
Android & Amir: Android 2D ( A Simple Example )
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:dove lanciare un thread automaticamente
« Risposta #2 il: 11 Dicembre 2014, 14:32:50 CET »
0
Puoi ottenere width e height "stabili" di una view registrando un View.OnLayoutChangeListener (con il metodo addOnLayoutChangeListener)

Ti viene chiamato ogni volta che tale View (può essere un FrameLayout o un ImageView dove devi visualizzare un immagine) cambia dimensione.

Viene chiamato sempre almeno una volta all'avvio.

Ciao.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 622
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:dove lanciare un thread automaticamente
« Risposta #3 il: 11 Dicembre 2014, 14:35:44 CET »
0
Visto che quello che ti serve sono le dimensioni delle viste (e non se sono state "inflatate" o meno), puoi sfruttare l'evento onMeasure delle View.

Dovresti anzitutto ridefinire la vista alla radice del tuo layout. Nel farlo fai l'override di onMeasure ed aggiungi un metodo setOnMeasureListener.

Codice (Java): [Seleziona]
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  if (myListener != null) {
    myListener.onMeasured();
  }
}

private OnMeasureListener myListener;

public void setOnMeasureListener(OnMeasureListener listener) {
  myListener = listener;
}

Nella onCreate, quando assegni il layout all'activity, prendi il riferimento alla radice (che è un'istanza della classe che hai creato), e gli imposti un listener tramite setOnMeasureListener:

Codice (Java): [Seleziona]
@Override
public void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.quick_dice_activity);
  MyRelativeLayout root = (MyRelativeLayout)findViewById(R.id.my_root);
  root.setOnMeasureListener(new OnMeasureListener() {
    @Override
    public void onMeasured() {
      //Avvia qui il thread - occhio a non incasinarti con lo UI thread
    }
  });
}


Attenzione: se non ricordo male il metodo onMeasure è invocato più di una volta durante il calcolo delle dimensioni effettive.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Alexofalco

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Advance
  • Sistema operativo:
    2.3.6
Re:dove lanciare un thread automaticamente
« Risposta #4 il: 11 Dicembre 2014, 15:12:18 CET »
0
Grazie per il supporto.

Avevo già provato ad utilizzare View.OnLayoutChangeListener ma non mi ha convinto del tutto. Utilizzare una surfaceView più thread mi sembra un buon compromesso. Per ora utilizzo thread+view normale con una primitiva sincronizzazione tra le due, ma come pattern di sviluppo mi sembra più corretto utilzzare SurfaceView+thread+callback. Sembra affatto apposta per questi casi :D

Condivido anche questo link, l'ho trovato solo di recente e sembra leggermente più dettagliato in fase di spiegazione, anche se non troppo
http://www.edu4java.com/en/androidgame/androidgame2.html

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:dove lanciare un thread automaticamente
« Risposta #5 il: 11 Dicembre 2014, 18:06:53 CET »
0
Tieni presente che la SurfaceView è un po' preistorico come metodo, si è poi evoluto nella TextureView ( TextureView | Android Developers ) anche se il nome potrebbe farla sembrare altro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Alexofalco

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Advance
  • Sistema operativo:
    2.3.6
Re:dove lanciare un thread automaticamente
« Risposta #6 il: 11 Dicembre 2014, 18:59:30 CET »
0
Preistorico dici?
 Non conosco le textureview ma oggi studiando le surface ho apprezzato i vantaggi: con qualche riga di codice in più si ottiene un sistema capace di gestire meglio i singoli disegni su schermo.
Ancora non mi abituo alla rigidità del codice ma penso che peggio di così non può andare XD

 In ogni caso ho ancora piccole difficoltà a posizionare i vari get per prendermi le dimensioni. Forse ho studiato/ sperimentato troppo poco XD


Inviato dal mio GT-I9070 con Tapatalk 2