2012-03-15 8 views
7

こんにちは私は私のcode..myコードに問題があるが、このようなjava.lang.RuntimeException: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); 

とエラーになります:

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) 

サーバーへのデータの保存活動は、私がプログレスバーを命じる場合は、これはworked..whatない実行されますが、もしことができない私は、この問題を解決するために行う必要があります?

答えて

13

おそらく、アクティビティのコンテキストを使用しているスレッドが原因でエラーが発生している可能性があります。

通常のスレッドの代わりにAsyncTaskを使用する必要があります。 AsyncTaskには、メインスレッドで実行中のメソッドonPreExecute()onPostExecute()があり、バックグラウンドで実行するメソッドdoInBackground()があります。これにより、ロングライブプロセスを簡単に実装できます。

あなたはthis example

4

を参照することができますが、問題のコードは活動の内部にある場合でも、ユニティを使用しているとき時々、あなたは私の場合のように(この問題が発生する可能性のあるUIスレッド

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

に指定されたアクションを実行します。ゲームエンジン)。

次のコードは私のために働いています。

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

あなたがAsyncTaskを使用している、あなたは、あなたは、例えば、トーストなどの機能を実行することができず、doInBackgroundスレッド の処理を実行する新しいフラグメントを開いています。

このエラーが発生した場合は、このコードを使用してコードを実行する新しいスレッドを作成してみてください。バックグラウンドプロセスではなく、フォアグラウンドに移行します(私が理解する限り)。断片について

:活動のため

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

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

2つの違いは、あなたがあなたのスレッドを実行するためにthis、またはgetActivity()を呼び出しているかどうかだけです。どちらの方法でも、実行中のアクティビティに新しいスレッドが作成されます。

私はそれが助けてくれることを願っています!

ああ、1のような独自の関数、作成することができますAsyncTaskにノートとして:あなたのAsyncTaskクラスの一部であり、これらの機能では、

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

を、これはあなたが置くところコードrunOnUiThread()。うまくいけばそれはより明確です。

関連する問題

 関連する問題