2012-03-15 15 views
7

hola tengo un problema con mi código code..my esjava.lang.RuntimeException: No se puede crear manejador de rosca interior que no ha llamado Looper.prepare()

progressD = ProgressDialog.show(MenuUtama.this, "", "Uploading files to server.....", false); 
Thread thread = new Thread(new Runnable(){ 
     public void run(){ 
      //doFileUpload(); 
      try { 
      // setiap parameter yang akan dikirim melalui http 
      // harus encode agar 
      // dapat terbaca dengan baik oleh server 
      Cursor c = helper.getAll1(almagId); 
      Cursor cr = helper.getUpImage(almagId); 
       if(c.moveToFirst()){ 
        //progressD = ProgressDialog.show(context, title, message) 
         do{ 
          String kdstore = URLEncoder.encode(helper.getKdStore(c).toString(), "utf-8"); 
          String nama = URLEncoder.encode(helper.getNama(c).toString(), "utf-8"); 
          String alamat = URLEncoder.encode(helper.getAlamat(c).toString(), "utf-8"); 
          String kdpos = URLEncoder.encode(helper.getKdPos(c).toString(), "utf-8"); 
          String notelp = URLEncoder.encode(helper.getNotel(c).toString(), "utf-8"); 
          String lng = URLEncoder.encode(helper.getlng(c).toString(), "utf-8"); 
          String lat = URLEncoder.encode(helper.getLat(c).toString(), "utf-8"); 
          String perush = URLEncoder.encode(helper.getPerus(c).toString(), "utf-8"); 
          //String gambar = URLEncoder.encode(helper.getGamb(c).toString(), "utf-8"); 

          //Toast.makeText(this, kdstore, Toast.LENGTH_LONG).show(); 
          //System.out.println(gambar); 
          url += "?kode_toko=" + kdstore + "&&nama=" + nama + "&&alamat=" + alamat + 
          "&&kode_pos=" + kdpos + "&&no_telp=" + notelp + "&&longitude=" + lng + "&&latitude=" + lat + 
          "&&perusahaan=" + perush; 
          getRequest(url); 
          url = "http://10.234.165.232/upload_get.php"; 
         }while(c.moveToNext()); 
      } 
      if(cr.moveToFirst()){ 
       do{ 
        String kdstore = URLEncoder.encode(helper.getKdstore1(cr), "utf-8"); 
        String gambar = URLEncoder.encode(helper.getGam1(cr), "utf-8"); 
        url1 += "?kode_toko1=" + kdstore + "&&gambar1=" + gambar; 
        getRequest1(url1); 
        url1 = "http://10.234.165.232/upload_get2.php"; 
       }while(cr.moveToNext()); 
      } 

      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      MenuUtama.this.runOnUiThread(new Runnable(){ 
       public void run() { 
        if(progressD.isShowing()) 
         progressD.dismiss(); 
       } 
      }); 
     } 
}); 
thread.start(); 
return(true); 

y error como este:

FATAL EXCEPTION: Thread-9 
java.lang.RuntimeException: 
Can't create handler inside thread that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:121) 
    at android.widget.Toast.<init>(Toast.java:68) 
    at android.widget.Toast.makeText(Toast.java:231) 
    at com.sat.alfaloc.MenuUtama.getRequest(MenuUtama.java:160) 
    at com.sat.alfaloc.MenuUtama$1.run(MenuUtama.java:101) 
    at java.lang.Thread.run(Thread.java:1096) 

si la actividad de guardar los datos en el servidor que ordenan la barra de progreso puede funcionar, pero si no esto no worked..what debo hacer para solucionar este problema ??

Respuesta

13

Probablemente reciba un error debido al hilo en el que está utilizando el contexto de la actividad.

Debe usar AsyncTask en lugar de un hilo normal. En AsyncTask hay un método onPreExecute() y onPostExecute() que se están ejecutando en el hilo principal y hay un método doInBackground() que se ejecutará en segundo plano para que pueda implementar fácilmente el proceso de larga duración.

Se puede hacer referencia this example

4

ejecuta la acción especificada en el subproceso de interfaz de usuario

ActivityName.runOnUiThread(new Runnable() { 
    public void run() { 
     //put your code here 
    } 
}); 
5

A veces puede encontrarse con este problema incluso cuando el código erróneo está dentro de la actividad (como en mi caso cuando se utiliza la Unidad motor de juegos).

El siguiente código me ha funcionado.

 this.runOnUiThread(new Runnable() { 
      public void run() { 
       //Your code here 
       ... 
      } 
     }); 
2

cuando se utiliza un AsyncTask y son procesos en el hilo doInBackground ejecutando no puede realizar funciones tales como la tostada y, por ejemplo, la apertura de un nuevo fragmento.

Cuando encuentre este error en particular, intente utilizar este código para crear un nuevo hilo para ejecutar su código. Lo traerá al primer plano, en lugar de un proceso en segundo plano (por lo que yo entiendo).

Para Fragmentos:

getActivity().runOnUiThread(new Runnable() 
{ 
    public void run() 
    { 
     // Send Toast 
     Toast.makeText(getActivity(), "Your Message!", Toast.LENGTH_SHORT).show(); 
    } 
}); 

Para la Actividad:

this.runOnUiThread(new Runnable() 
{ 
    public void run() 
    { 
     // Send Toast 
     Toast.makeText(this, "Your Message!", Toast.LENGTH_SHORT).show(); 
    } 
}); 

La diferencia entre los dos es solamente si usted está llamando this o getActivity() para hacer funcionar su hilo en. De cualquier forma, ambos crean un nuevo hilo en la actividad que se está ejecutando.

Espero que ayude!

Ah, y como una nota, en el AsyncTask uno puede crear sus propias funciones, tales como:

protected void myTaskFunction() throws exception 
{ 
    // Stuff to do 
} 

En estas funciones, que son parte de la clase AsyncTask, este es el lugar donde quiere poner ese runOnUiThread() pedazo de código. Espero que eso esté más claro.

Cuestiones relacionadas