Sto sviluppando un'applicazione Android e ho un pulsante che avvia/interrompe determinati processi di simulazione. Mentre questo processo è in esecuzione, ho bisogno di generare alcuni dati da esso in tempo reale. Ma quando creo un nuovo thread per la simulazione, non posso accedere alle viste (lascia che sia TextView) da questo thread, perché è possibile accedervi solo dal thread in cui sono stati creati. D'altra parte, il nuovo thread è necessario perché altrimenti l'utente non sarebbe in grado di fare nulla mentre la simulazione è in esecuzione (ad esempio, premere altri pulsanti). Creare un nuovo servizio richiede anche la creazione di un nuovo thread in questo caso. Come dovrei risolvere questo problema?Accesso alle viste da altro thread (Android)
risposta
È possibile gestire in molti modi,
tenta di utilizzare AsyncTask in questo, il vostro lavoro sfondo fatto in doInBackGround() metodo e l'interfaccia utente non bloccherà e si può anche accedere alle visualizzazioni di Attività da cui si chiama AsyncTask dal relativo contesto tramite publishProgress() e onProgressUpdate().
Se si utilizza un semplice filo quindi utilizzando Handler o messaggio o runOnUiThread è possibile aggiornare la vista del thread principale.
ma, in your way I think AsyncTask is best for you.
È possibile risolvere il problema con android.os.Handler. L'istanza di Handler è legata al thread che la crea, puoi postare Runnables su di essa e li eseguirà nel thread a cui è associata. Ad esempio:
import android.os.Handler;
import android.widget.TextView;
public class MyActivity extends Activity {
private Handler uiHandler;
private TextView simulationStatus;
@Override
public void onCreate(Bundle savedInstanceState) {
...
uiHandler = new Handler();
...
simulationStatus = (TextView) findViewById(R.id.simulationStatus);
...
}
// This method is to be executed on the simulation thread.
public void simulate() {
...
final String simulationStatusText = ...;
...
uiHandler.post(new Runnable() {
@Override
public void run() {
// This is run on the UI thread.
simulationStatus.setText(simulationStatusText);
...
}
});
}
...
}
È inoltre possibile utilizzare AsyncTask. Vedi il link per esempio.
Passare l'attività al thread e utilizzarlo dall'interno per accedere alle visualizzazioni.
// from your activity:
myExternalThread = new MyCustomCode(this); // <-- activity passed
// your "simulation process" constructor:
public MyCustomCode(Activity parent) {
this.parent = parent;
}
// and when you want to access views:
parent.runOnUiThread(new Runnable() {
@Override
public void run() {
parent.findViewById(R.id.text_view);
... do something to your UI ...
}
});
Il mio modo preferito di creazione di queste attività esterne è quello di utilizzare AsyncTask
(allora non dovete preoccuparvi di runOnUiThread
, tra gli altri benefici). Non so se si applica al tuo caso, ma dovresti verificarlo.
Perché il -1?Alcuna spiegazione? – Guillaume
è necessario memorizzare i dati che si vogliono mostrano in una var pubblico e lasciate che il vostro Discussione chiamare un Runnable tramite Handler.post (eseguibile) Il codice nella corsa() Il metodo Runnable è in grado di accedere a Textview
Sono accessibili ma solo di sola lettura. Ciò che intendi è che vuoi attivare i cambiamenti da un thread sulle viste. Dal thread di lavoro (non-UI) queste modifiche non possono essere attivate, è necessario utilizzare .runOnUiThread()
o utilizzare Handlers
. Utilizzare questi nel punto in cui si desidera mostrare qualcosa, ad esempio aggiornare il TextView in .runOnUiThread(),
Esempio:
myThread = new Thread()
{
@Override
public void run() {
//yourOperation
MyActivity.this.runOnUiThread(new Runnable(){
@Override
public void run() {
if(e!=null)
{
myTextView.setText("something");
}
}});
super.run();
}
};
myThread.start();
è effettivamente possibile leggere solo una vista da un thread non-ui come hai detto? Sono interessato alla lettura di una bitmap da una vista utilizzando Bitmap drawingCache = view.getDrawingCache(), ma continuo a ricevere l'eccezione: CalledFromWrongThreadException: solo il thread originale che ha creato una gerarchia di viste può toccare le sue viste. – Giorgio
- 1. Accesso alle proprietà ViewModel da thread separati
- 2. Accesso di dominio da thread errato Android
- 3. Perl: accesso alle variabili "my" da un altro file
- 4. Accesso alle risorse da un altro file jar
- 5. Allegare più listener alle viste in Android?
- 6. Android - collegare i dati alle viste
- 7. Accesso alle variabili di ambiente da Android Studio gradle build
- 8. Accesso a una variabile di un thread da un altro thread in java
- 9. ANDROID: accesso alle condivisioni CIFS in Java
- 10. getOnClickListener() nelle viste Android
- 11. Accesso alle righe eliminate da un DataTable
- 12. Accesso alle risorse Gradle da Java
- 13. accesso alle proprietà bambino da portata genitore
- 14. Come accedere alle viste nell'actionLayout nel menu
- 15. cattura eccezioni da un altro thread
- 16. Aspettarsi chiamate googlemock da un altro thread
- 17. Tipo C# anonimo accesso da altro metodo
- 18. Accesso agli oggetti da un altro processo
- 19. Come aggiungere le viste alle viste a livello di programmazione
- 20. Accesso alle parti dell'array
- 21. Accesso alle variabili statiche
- 22. Accesso alle risorse JAR
- 23. Accesso dinamico alle celle
- 24. Accesso simultaneo alle telecamere posteriore e anteriore
- 25. Accesso alle impostazioni delle app da più file Web.config
- 26. Accesso alle variabili di configurazione da altri file di configurazione
- 27. Accesso alle foto memorizzate sul dispositivo WP7
- 28. Accesso alle risorse in un progetto di prova Android
- 29. Accesso alle e-mail da gmail tramite IMAP (javamail API)
- 30. Android: accesso alle risorse senza attività o refeerence del contesto
Avete verificato il [ 'AsyncTask'] (http: // sviluppatore .android.com/reference/android/os/AsyncTask.html) classe? È una classe di utilità che ti aiuta a creare facilmente thread diversi e ad aggiornare di conseguenza gli elementi dell'interfaccia utente. In questo caso potresti usare i metodi 'publishProgress()' e 'onProgressUpdate()'. –