Estoy desarrollando una aplicación para android y tratando de lidiar con los hilos sin realmente saber mucho acerca de ellos… (Sí, tonta de mí, lo sé)
Voy a tratar de explicar adecuadamente y con bastante rapidez.

En el método onCreate de mi actividad, voy a llamar a un AlertDialog para hacer que el usuario elija para cargar datos desde internet o directamente de acceso de la aplicación con los datos previamente almacenados en la base de datos.

Para que, en el onCreate, llamo a mi método para elevar el AlertDialog, positiva botón debe iniciar el subproceso de trabajo para la descarga, y negativo el botón de llamada intención de pasar a la siguiente actividad. Hasta ahora tengo esto :

  • llamando no wait() en cualquier lugar, mi AlertDialog aparece pero el hilo se inicia de todos modos
  • llamando wait() en la primera línea de mi hilo, tengo que declarar estática para acceder a ella desde los oyentes de mi AlertDialog y ser capaz de notify() o interrupt(), recibo el error: object not locked by thread before wait().

worker = new Thread(new Runnable() {
        public void run() {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

[resto de mi método run]

private void miseAJourDesDonnes() {
    confirmInscrip = new AlertDialog.Builder(this).setMessage(
            "Voulez-vous mettre à jour l'intégralité des données de l'application? (Connexion internet requise").setPositiveButton("Mettre à jour",
            okListener).setNegativeButton("Continuer sans", nonListener);
    confirmInscrip.create();
    confirmInscrip.show();
}

OnClickListener okListener = new OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
        Toast.makeText(AccueilSplash.this, "Mise à jour en cours", Toast.LENGTH_SHORT).show();
        worker.notify();
        return;
    }
};
OnClickListener nonListener = new OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
        Toast.makeText(AccueilSplash.this, "Accès direct à l'application", Toast.LENGTH_SHORT).show();
        worker.interrupt();
        Intent entre = new Intent(AccueilSplash.this, Androt.class);
        startActivity(entre);
    }
};

trabajador es mi ejemplo de Hilo (el bbackground uno)
Solo estoy siendo tonto o Es que hay una sutileza que me has comprendido?
gracias por la respuesta…

  • Post algo más de código. Supongo que tienes algo mal con AlertDialog.
  • ok, post editado con mi alerta
  • ¿dónde se invoca trabajador.start()?
InformationsquelleAutor Sephy | 2010-03-06

2 Comentarios

  1. 8

    A continuación es una explicación rápida de cómo wait() y notify() funciona, pero podría sugerir que usted acaba de no crear el subproceso de trabajo, a menos que el usuario hace clic en ok? Usted todavía puede querer cancelar el hilo más adelante si así lo desea detener la descarga, pero creando el hilo, incluso antes de saber si va a ser utilizado no parece ser el mejor enfoque.

    Con el fin de llamar wait(), notify(), o notifyAll() en un objeto, primero debe poseer el monitor del objeto al que desea llamar el método, por lo que en su caso dentro de los ejecutables esto sería como tendría que hacerlo:

    Runnable runnable = new Runnable() {
        public void run() {
          //wait(); This call wouldn't work
          syncronized (this) {
            wait();  //This call will work
          }
        }
    };

    Para notificar que el ejecutable también tendría que tener el monitor

    //runnable.notifyAll(); this call will not work
    syncronized (runnable) {
        runnable.notifyAll(); //this call will work
    }

    Para obtener más información acerca de hilos y concurrencia en Java yo sugeriría Java Concurrencia en la Práctica


    Puede haber algunos construido en el marco de las tareas en segundo plano en Android que no sé, pero el uso puro de java el método más fácil para que esto parece que sería algo como esto:

    privado Hilo downloadThread;

    OnClickListener okListener = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            Runnable download = new Runnable() {
                public void run() {
                    //Create your input streams and such
                    boolean downloadComplete = false;
                    while(!downloadComplete  && !Thread.currentThread().isInterruped()) {
                        //Do some downloading
                    }
                    if (!Thread.currentThread().isInterruped()) {
                        //Alert user of success.
                    }
                }
            };
            downloadThread = new Thread(download);
            downloadThread.start();
        }
    };
    OnClickListener cancelListener = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            downloadThread.interrupt();
        }
    };
    • mm, creo que si usted crea un nuevo Hilo en el oklistener, no se puede interrumpir a partir de la cancellistener… Una excluye a la otra. Gracias por la explicación (voy a tener una mirada más de cerca en la noche, tengo que hacer algún trabajo en hilos), finalmente llegué a una solución de la clase AsyncTask de android: developer.android.com/intl/fr/reference/android/os/…
    • AsyncTask es el camino a seguir para tareas en segundo plano. Se ofrece un muy buen api.
  2. 0

    Soy nuevo en el uso de hilos así, pero podría intentar la lectura de este ejemplo para darle un buen punto de partida. Se trata de cuadros de diálogo de progreso, pero ilustra cómo manejar los hilos y poner en marcha en el momento adecuado. Lo realmente útil de código se derrumbó bajo el » ver más información sobre el Progreso Dialgos con un segundo Hilo conductor de la sección.

    Va a su código, creo que tu error está en cómo declarar tu hilo. Trate de crear es como una clase de la ampliación de Hilo. por ejemplo,

    private class Worker extends Thread{
        Handled mHandler;  //See the example linked above for how to use handlers
        int progress;
        //and whatever other variables it might need
    
        worker(Handled h){
            mHandler = h;
            //and any other initialisation you need
        }
    
        public void run(){
            //and all your code here
        }
    }

    Entonces no pasa nada con este Hilo hasta que se crea la instancia de la siguiente, en su onClickListeners.

    Worker worker = new Worker(handler)

    Incluso después de que en realidad no se iniciará hasta que llame trabajador.start(). Definir el controlador de eventos a lo largo de las líneas de

    final Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            int progress = msg.getData().getInt("progress");
            loadingDialog.setProgress(progress);
            if (progress >= 100){
                dismissDialog(LOADING_DIALOG);
            }
        }
    };

    La esperanza de que le ayudará a empezar! Lea el enlace de arriba, como me imagino que usted querrá algún tipo de diálogo de progreso así cuando se está haciendo la carga de la página web. O tal vez se llevaría a cabo en un servicio en segundo plano, pero no pude ayudar con eso.

    • Estoy realmente tener un ir en AsyncTask que es exactamente lo que necesito y está muy bien implementado en Android, y si no lo encuentro, voy a volver a tus consejos. gracias

Dejar respuesta

Please enter your comment!
Please enter your name here