Soy nuevo en Android y estoy tratando de usar el UI-Thread, así que escribí una actividad de prueba simple. Pero creo que he entendido mal algo, porque al hacer clic en el botón, la aplicación ya no responde
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
Simplemente envuélvalo como una función, luego llame a esta función desde su hilo de fondo.
fuente
final
)Lo tienes al revés. El clic de su botón genera una llamada
runOnUiThread()
, pero esto no es necesario, ya que el controlador de clics ya se está ejecutando en el hilo de la interfaz de usuario. Luego, su códigorunOnUiThread()
está lanzando un nuevo subproceso en segundo plano, donde intenta realizar operaciones de IU, que luego fallan.En su lugar, simplemente inicie el hilo de fondo directamente desde su controlador de clics. Luego, envuelva las llamadas a
btn.setText()
dentro de una llamada arunOnUiThread()
.fuente
runOnUiThread()
es innecesaria pero debe ser inofensiva. El Javadoc para ese método dice "Ejecuta la acción especificada en el subproceso de la interfaz de usuario. Si el subproceso actual es el subproceso de la interfaz de usuario, la acción se ejecuta inmediatamente. Si el subproceso actual no es el subproceso de la interfaz de usuario, la acción se publica en la cola de eventos del hilo de la interfaz de usuario ".fuente
Hay varias técnicas que utilizan runOnUiThread (), veamos todas
Este es mi hilo principal (hilo de la interfaz de usuario) llamado AndroidBasicThreadActivity y lo voy a actualizar desde un hilo de trabajo de varias maneras:
1.) Al pasar la instancia de Activity como argumento en el subproceso de trabajo
2.) Al utilizar el método de publicación de View (Runnable runnable) en el subproceso de trabajo
3.) Al usar la clase Handler del paquete android.os Si no tenemos el contexto (this / getApplicationContext ()) o la instancia de Activity (AndroidBasicThreadActivity.this), entonces tenemos que usar la clase Handler de la siguiente manera:
fuente
Si se usa en fragmentos, simplemente escriba
fuente
tu esto:
fuente
Utilizamos Worker Thread para hacer que las aplicaciones sean más fluidas y evitar los ANR. Es posible que necesitemos actualizar la interfaz de usuario después del proceso pesado en la banda de rodadura de los trabajadores. La interfaz de usuario solo se puede actualizar desde UI Thread. En tales casos, usamos Handler o runOnUiThread, ambos tienen un método de ejecución Runnable que se ejecuta en UI Thread. El método onClick se ejecuta en el subproceso de la interfaz de usuario, por lo que no es necesario usar runOnUiThread aquí.
Usando Kotlin
Mientras está en actividad,
Del fragmento,
Usando Java ,
fuente
Puede usar de esta muestra:
En el siguiente ejemplo, vamos a utilizar esta función para publicar el resultado de una búsqueda de sinónimos procesada por un subproceso en segundo plano.
Para lograr el objetivo durante la devolución de llamada de actividad OnCreate, configuraremos onClickListener para ejecutar searchTask en un hilo creado.
Cuando el usuario hace clic en el botón Buscar, crearemos una clase anónima Runnable que busca la palabra escrita en R.id.wordEt EditText e inicia el hilo para ejecutar Runnable.
Cuando finalice la búsqueda, crearemos una instancia de Runnable SetSynonymResult para publicar el resultado en el sinónimo TextView sobre el hilo de la interfaz de usuario.
Esta técnica a veces no es la más conveniente, especialmente cuando no tenemos acceso a una instancia de Actividad; por lo tanto, en los siguientes capítulos, vamos a discutir técnicas más simples y limpias para actualizar la interfaz de usuario desde una tarea informática en segundo plano.
Fuente :
programación asincrónica de Android Helder Vasconcelos
fuente
Así es como lo uso:
fuente
fuente
Prueba esto:
getActivity().runOnUiThread(new Runnable...
Eso es porque:
1) lo implícito en su llamada a runOnUiThread se refiere a AsyncTask , no a su fragmento.
2) Fragment no tiene runOnUiThread.
Sin embargo, la actividad sí.
Tenga en cuenta que Activity solo ejecuta Runnable si ya está en el hilo principal; de lo contrario, utiliza un Handler. Puede implementar un controlador en su fragmento si no quiere preocuparse por el contexto de esto, en realidad es muy fácil:
// Una instancia de clase
// en cualquier otro lugar de tu código
// ^ esto siempre se ejecutará en el siguiente ciclo de ejecución en el hilo principal.
fuente