java.lang.RuntimeException: Can't create handl

2019-03-27 18:25发布

问题:

hi i have a problem with my code..my code is

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);

and error like this :

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)

if activity save data in to server I command the progress bar can run,but if not this not worked..what should i do to fix this problem??

回答1:

Probably you are getting error because of the thread in which you are using the context of the activity.

You should use the AsyncTask instead of a normal thread. In AsyncTask there is a method onPreExecute() and onPostExecute() which are executing on the main thread and there is a method doInBackground() which will execute on background so that you can easily implement the long live process.

You can refer this example



回答2:

Sometimes you might encounter this problem even when the offending code is inside the Activity (as in my case when using Unity game engine).

The following code has worked for me.

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


回答3:

Runs the specified action on the UI thread

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


回答4:

When you are using an AsyncTask and you are running processes in the doInBackground thread you cannot perform functions such as Toast and, for example, opening a new fragment.

When you encounter this particular error, try using this code to create a new thread to run your code on. It will bring it to the foreground, rather than a background process (as far as I understand).

For Fragments:

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

For Activity:

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

The difference between the two is only whether you are calling this, or getActivity() to run your thread on. Either way they both create a new thread on the activity that is running.

I hope that helps!

Oh, and as a note, in the AsyncTask one can create their own functions, such as:

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

In these functions, that are part of your AsyncTask class, this is where you'd put that runOnUiThread() piece of code. Hopefully that is clearer.