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.
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,
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.