Name is Nilay
Name is Nilay

Reputation: 2783

Runtime Exception While using AsyncTask

I am doing mutlithreading in my program with AsyncTask by calling a Method after 10 secs but instead having this Exception :

08-04 11:49:29.565: E/log_tag(885): Error converting result java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Plz help me !!

Edit: This is code for AsyncTask:

  class Getphonenumber extends AsyncTask<String, Void, Void> {
         public Void doInBackground(String... p) {
          while (true) {
              getPhno();
           try {
            Thread.sleep(10000);
           } catch (InterruptedException ie) {
            ie.printStackTrace();
           }
          }
        }

        };

'getPhno()' method:

public void getPhno()
  {
      try{

            HttpClient httpclient = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); //Timeout Limit
            List<NameValuePair> username = new ArrayList<NameValuePair>();
            username.add(new BasicNameValuePair("username", user));
            //Web Address
            HttpPost httppost = new HttpPost("http://www.starretailshop.com/Log/Retrieve.php");
            httppost.setEntity(new UrlEncodedFormEntity(username));
            HttpResponse response = httpclient.execute(httppost);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httppost,
                    responseHandler);

            Log.i("retrieve postData", response.getStatusLine().toString());
            InputStream content = response.getEntity().getContent();
            BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
            String s = "";
            while ((s = buffer.readLine()) != null) {

                sendMsg(s,msg);

            }

            }catch(Exception e){

                  Log.e("log_tag", "Error converting result "+e.toString());
            }
  }

'sendMsg' Method:

private void sendMsg(String phoneNumber, String message)
    { 
       try{
            String phoneNumber1 = null;

           if(phoneNumber.startsWith("+"))
            {
                phoneNumber1 = phoneNumber.substring(3);

            }
            else if(phoneNumber.startsWith("0"))
            {
                phoneNumber1 = phoneNumber.substring(1);
            }
            else
            {
                phoneNumber1=phoneNumber;
            }
                PendingIntent pi = PendingIntent.getActivity(this, 0,
                    new Intent(), 0);                
                SmsManager sms = SmsManager.getDefault();
                sms.sendTextMessage(phoneNumber1, null, message, pi, null);
                Toast.makeText(this,"Msg sent to:" + phoneNumber1, Toast.LENGTH_LONG).show();
                phnoList.add(phoneNumber);
                phnoListd.add(phoneNumber1);
                //phnumber = phoneNumber;
                //================Update Database=====================

              try{
                  HttpClient httpclient = new DefaultHttpClient();
                  HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); //Timeout Limit
                  List<NameValuePair> updatemsg = new ArrayList<NameValuePair>();
                  updatemsg.add(new BasicNameValuePair("outmsg1", message));
                  Calendar cal = Calendar.getInstance();
                  SimpleDateFormat sdf = new SimpleDateFormat("HH:m:ss dd-MM-yyyy");
                  String TimeStampDB = sdf.format(cal.getTime()); 
                  updatemsg.add(new BasicNameValuePair("currentdatetime1",TimeStampDB));
                  updatemsg.add(new BasicNameValuePair("mobileno",phoneNumber));

                    //Web Address
                    HttpPost httppost = new HttpPost("http://www.starretailshop.com/Log/Update1.php");
                    httppost.setEntity(new UrlEncodedFormEntity(updatemsg));
                    HttpResponse response = httpclient.execute(httppost);
                    ResponseHandler<String> responseHandler = new BasicResponseHandler();
                    String responseBody = httpclient.execute(httppost,
                            responseHandler);
                    Log.i("update1 postData", response.getStatusLine().toString());
                    }catch(Exception e){
                        Log.e("log_tag", "Error converting result "+e.toString());
                    }

                    //================================================
          }catch(Exception e)
          {
              e.printStackTrace();
              Toast.makeText(this,"Error occured", Toast.LENGTH_LONG).show();
          }


}

Finally I am calling new Getphonenumber().execute(); in an onClickListener of a Button.

Upvotes: 0

Views: 1498

Answers (3)

Andro Selva
Andro Selva

Reputation: 54322

What I think to be the problem is, you are trying to update your UI components from your background Thread.

For example, consider this method in your AsyncTask,

protected Void doInBackground(String ... x) {
      while (true) {
       System.out.println(x[0]);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException ie) {
        ie.printStackTrace();
       }
      }

This method is just equivalent to a background thread. And in Andorid you can update your UI only form the main UI thread and when you try to do that from any other method you will get this exception.

So try to avoid this. If you want to update your UI, use the onPostExecute() of your AsyncTask.

EDIT 1

here is your problem. Remove the toast from sendMsg method and it should work fine.

Upvotes: 3

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132992

use runOnUiThread for Updating UI from Non - Ui Thread.like as code Provided by you. you are showing Toast Messages from Background Thread so put Toast Messages inside runOnUiThread as:

Current_Activity.this.runOnUiThread(new Runnable() {
  public void run() {

  Toast.makeText(this,"Msg sent to:" + phoneNumber1, Toast.LENGTH_LONG).show();
  }
});

Upvotes: 2

Siddharth
Siddharth

Reputation: 9574

Instead of creating a sleep thread inside the doBackround, do it before you .execute(). I guess that will help.

Upvotes: 1

Related Questions