I am trying to implement GCMIntentService in my android application.
When I tried to save the registration id in my database, the asynhttp showing the following error " sending message to a Handler on a dead thread"
The following is my code
import com.google.android.gcm.GCMBaseIntentService;
public class GCMIntentService extends GCMBaseIntentService {
ProgressBar progress;
AlertDialog.Builder builder;
AlertDialog dialog;
Context context;
Integer flags=0;
String regId;
public GCMIntentService() {
super(SENDER_ID);
}
private static final String TAG = "===GCMIntentService===";
@Override
protected void onRegistered(Context arg0, String registrationId) {
Log.i(TAG, "Device registered at raj: regId = " + registrationId);
tes(registrationId);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
//Log.i(TAG, "unregistered = "+arg1);
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.i(TAG, "new message= "+arg0);
Bundle extras = arg1.getExtras();
String tat=extras.getString("msg");
JSONObject jsono = stringToJsonobj(tat.toString());
try {
String message=jsono.getString("price");
generateNotification(arg0, message);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onError(Context arg0, String errorId) {
Log.i(TAG, "Received error: " + errorId);
}
@Override
protected boolean onRecoverableError(Context context, String errorId) {
return super.onRecoverableError(context, errorId);
}
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
public JSONObject stringToJsonobj(String result)
{
JSONObject jObj = null;
try {
jObj = new JSONObject(result);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
private static void generateNotification(Context context, String message) {
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher, message, when);
String title = "Test Application";
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("message", message);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent =
PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults|= Notification.DEFAULT_LIGHTS;
notification.defaults|= Notification.DEFAULT_VIBRATE;
notification.flags |= Notification.DEFAULT_LIGHTS;
notificationManager.notify(0, notification);
}
protected void tes(final String regId){
ConnectionDetector cd= new ConnectionDetector(getApplicationContext());
String domain = cd.getUrl();
SharedPreferences mPrefs=getSharedPreferences("prefs",0);
String token = mPrefs.getString("access_token", "");
AsyncHttpClient client = new AsyncHttpClient();
RequestParams webparams = new RequestParams();
webparams.put("fn", "loginProcess");
webparams.put("email","username" );
webparams.put("password", "password");
client.post(domain, webparams, new AsyncHttpResponseHandler() {
@Override
public void onStart() {
Log.v("Start","Started-"+regId+"-User Id-"+regId);
}
@Override
public void onSuccess(String response) {
dialog.dismiss();
Log.v("response",""+response);
try {
JSONObject obj = new JSONObject(response);
Integer status=obj.getInt("result");
String message=obj.getString("message");
if(status==1){
// Success
Integer success=obj.getInt("success");
if(success==1){
Integer registered=obj.getInt("login");
if(registered==1){
/* Session Save */
}
else {
}
}
else {
//setEr("Something went wrong. Please try again.");
}
}
else {
//setEr("Something went wrong. Please try again.");
}
} catch (Throwable t) {
}
}
@Override
public void onFailure(Throwable e, String response) {
//setEr("Something went wrong. Please try again.");
}
});
return;
}
Any idea ? Please help
Thanks in advance
Android maintains a MessageQueue on the main thread. Alongside looper and handler, MessageQueues are part of the building blocks of threading in Android and they are used virtually everywhere in the system. This class holds the list of messages to be dispatched by the looper. You can just call Looper.myqueue () to get the list of messages.
In android development, Activity is commonly used as the main thread. Android OS will create message queue and queue looper for the main thread automatically. So you can use Handler to send message to the Activity class to let it modify the UI component. Because UI component is thread unsafe, only main thread can modify it.
Call Looper.loop () to enter the message loop. If you want the worker thread to quit the message loop, please call Handler.getLooper ().quit (). 3. Android Child Thread Message Queue And Looper Example.
So, Android has provided handlers to make the inter-process communication easier. A handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each handler instance is associated with a single thread and that thread’s message queue.
Error comes because you are doing Async call in IntentService, Make sure do use Sync Call in Intent Service, I had run into the same problem and resolved it by making Sync. See below example of Sync call in Loopj Lib.
GCM On Register Method
@Override
protected void onRegistered(final Context context, final String registrationId)
{
final String userID = AIBSharedPreference.getInstance(context).getStringValue(StringConstants.PREF_USER_ID,
null);
if (null != userID)
{
WSUtils.registerGCMID(registrationId, userID);
}
}
WS Call for Saving Registration ID.
public static void registerGCMID(final String regID, final String userID)
{
final RequestParams params = new RequestParams();
params.put(WSConstant.PRM_USER_ID, userID);
params.put(WSConstant.PRM_DEVICE_ID, regID);
AppInBoxWS.syncPost("update_device_id", params);
}
WS Helper Class "AppInBoxWS"
public class AppInBoxWS
{
private static SyncHttpClient syncClient = new SyncHttpClient()
{
@Override
public String onRequestFailed(final Throwable error, final String content)
{
return null;
}
};
private static String getAbsoluteUrl(final String relativeUrl)
{
return WS_BASE_URL + relativeUrl;
}
public static String syncPost(final String url, final RequestParams params)
{
return syncClient.post(getAbsoluteUrl(url), params);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With