studio - oncancelled asynctask android
Android cómo ejecutarOnUiThread en otra clase? (6)
Aquí hay una solución si no quieres pasar el contexto:
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
// code goes here
}
});
En mi aplicación, en MainActivity, hay un hilo que funciona bien. Pero cuando llamo a otra clase para obtener datos del servidor, no puedo ejecutar un hilo. Vea el ejemplo de código a continuación.
class MainActivity extends Activity implements Runnable {
public void onCreate() {
new Thread(this).start();
}
public void run() {
//here is code for download data from server after completion this and in handler i m call other class in setdata() method....
}
public void setData() {
new CheckData(this);
}
}
class CheckData {
public CheckData(Context context) {
context.runUIonthread(){//cant call as runUIthread............
}
}
Es posible que desee echar un vistazo a AsyncTask. Aunque no es la mejor solución, te ayudará a comenzar.
http://developer.android.com/reference/android/os/AsyncTask.html
EDITAR
No veo por qué usar una AsyncTask no es una solución para ti, pero de todos modos. Puede mantener una clase Handler que se inicializa en el subproceso UI. Luego, usando este Manejador, puede publicar mensajes en la interfaz de usuario en forma de un ejecutable. Entonces, todo lo que necesita hacer es crear una instancia de un nuevo objeto Handler cuando se encuentre en el hilo de UI (antes de comenzar el nuevo) y luego compartirlo con su otra clase. Cuando hayas terminado, puedes usar esa instancia para enviar un mensaje de vuelta al hilo de la interfaz de usuario usando el método de publicación. Consulte la documentación de la clase Handler para obtener más detalles:
http://developer.android.com/reference/android/os/Handler.html
La actividad es una clase que extiende Contexto. Por lo tanto, no es necesario pasar tanto el contexto como la actividad. Puede pasar la actividad como contexto y luego puede usar el contexto para ejecutar en el subproceso de interfaz de usuario de la siguiente manera:
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
//Code goes here
}
});
Palabra de advertencia: solo use esto cuando esté seguro de que el contexto es un contexto de actividad, y no es una buena práctica suponer eso.
Si alguien está buscando una solución basada en Rx:
Observable.just(true)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aBoolean -> {
// cool stuff comes here
});
Vea el artículo Comunicación con el hilo de la interfaz de usuario .
Con Context
en mano, puede crear un Handler
en cualquier clase. De lo contrario, puede llamar a Looper.getMainLooper()
, de cualquier forma, obtiene el hilo de la interfaz de usuario principal.
Por ejemplo:
class CheckData{
private final Handler handler;
public Checkdata(Context context){
handler = new Handler(context.getMainLooper());
}
public void someMethod() {
// Do work
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code to run on UI thread
}
});
}
private void runOnUiThread(Runnable r) {
handler.post(r);
}
}
class MainActivity extends Activity implements Runnable{
public void oncreate(){
new Thread(this).start();
}
public void run(){
//here is code for download data from server after completion this and in handler i m call other class in setdata() method....
}
public void setdata();
{
new checkData(this,MainActivity.this);
}
}
class checkData{
public void checkdata(Context context,MainActivity mainactivity){
mainactivity.runUIonthread()..is works fine for me.....
}
}