Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android loopj + GCMIntentService sending message to a Handler on a dead thread

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

like image 817
ramesh Avatar asked Dec 27 '13 10:12

ramesh


People also ask

How to get the list of messages sent by Looper in Android?

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.

How to send message to activity in Android to modify component?

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.

How do I exit a message loop in Android?

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.

What is the use of handlers in Android?

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.


1 Answers

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);
    }
}
like image 168
jaym Avatar answered Sep 19 '22 02:09

jaym