Reputation: 2783
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
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
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
Reputation: 9574
Instead of creating a sleep thread inside the doBackround, do it before you .execute(). I guess that will help.
Upvotes: 1