2016-05-02 5 views
0

Ich versuche, ein Callback-Listener in meinem GcmListenerService zu implementieren. Ich muss eine Chat-Unterhaltung aktualisieren, sobald eine neue Nachricht eintrifft.Callback-Listener in Android Service funktioniert nicht - FATALE AUSNAHME: AsyncTask # 1

ich gehen Sie wie gewohnt den Hörer in der Host-Aktivität einrichten und den Service, aber ich bekomme die folgende Fehlermeldung, wenn das meine Rückruf Zuhörer zeigt Ergebnisse beginnt:

FATAL EXCEPTION: AsyncTask #1 java.lang.NullPointerException 
at com.cerculdivelor.gcm.MyGcmListenerService.onMessageReceived(MyGcmListenerService.java:69) 
at com.google.android.gms.gcm.GcmListenerService.zzq(Unknown Source) 
at com.google.android.gms.gcm.GcmListenerService.zzp(Unknown Source) 
at com.google.android.gms.gcm.GcmListenerService.zzo(Unknown Source) 
at com.google.android.gms.gcm.GcmListenerService.zza(Unknown Source) 
at com.google.android.gms.gcm.GcmListenerService$1.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:841) 

Was könnte falsch sein, ist Vielleicht ein schlechter Ansatz Callbacks in einem Service zu verwenden?

Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

GcmListenerService:

public class MyGcmListenerService extends GcmListenerService { 

    private static final String TAG = "MyGcmListenerService"; 
    private SQLiteDataSource datasource; 
    newMessageListener mListener; 

    /** 
    * Called when message is received. 
    * 
    * @param from SenderID of the sender. 
    * @param data Data bundle containing message data as key/value pairs. 
    *    For Set of keys use data.keySet(). 
    */ 
    // [START receive_message] 
    @Override 
    public void onMessageReceived(String from, Bundle data) { 


     if (data.getString("notiftype") != null && data.getString("notiftype").equals("message")) { 

      datasource = new SQLiteDataSource(this); 
      datasource.open(); 

      MessagesSetter message = new MessagesSetter(); 

      message.setConversationId(data.getString("conversationId")); 
      message.setSenderfbid(data.getString("senderfbid")); 
      message.setSendername(data.getString("sendername")); 
      message.setProdname(data.getString("prodname")); 
      message.setMessage(data.getString("message")); 
      message.setTime(data.getString("timestamp")); 
      message.setAction(data.getString("action")); 

      Log.i("TAG", data.getString("message")); 
      datasource.addMessage(message); 

      showMessageNotification(data); 

      //refresh the conversation in ConversationActivity 
      mListener.newMessageArieved(); 
     } 


... 

    // Interface to send selected image's position for deletion 
    public void setNewMessageListener(newMessageListener mListener) { 
     this.mListener = mListener; 
    } 


    public static interface newMessageListener { 
     public void newMessageArieved(); 
    } 
} 

Host-Aktivität:

public class ConversationActivity extends AppCompatActivity implements MyGcmListenerService.newMessageListener { 

    private ListView listview; 
    private SQLiteDataSource datasource; 
    private Bundle extras; 
    private String myFbId; 
    private String senderFbId; 
    private String conversationId; 
    private EditText replyText; 
    private ImageView sendReplyBtn; 
    private HttpConActivity http; 
    private ArrayList<MessagesSetter> conversation; 
    private String myName; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.conversation_layout); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.messageToolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 


     SharedPreferences preferences = getSharedPreferences("user", 
       MODE_PRIVATE); 

     myFbId = preferences.getString("fbId", ""); 
     myName = preferences.getString("name", ""); 

     extras = getIntent().getExtras(); 
     if (extras != null) { 
      conversationId = extras.getString("conversationId"); 
     } 

     //set up the listener for new message arievals 
     MyGcmListenerService serv = new MyGcmListenerService(); 
     serv.setNewMessageListener(this); 


... 


@Override 
    public void newMessageArieved() { 
     conversation = datasource.getConversation(conversationId); 
     ConversationListViewAdapter messAdapt = new ConversationListViewAdapter(this, 
       R.layout.conversation_row_layout, conversation); 
     listview.setAdapter(messAdapt); 
     Log.i("TAG", "NEW MESSAGE!"); 
    } 
+0

Vielleicht irre ich mich, aber ich denke, dass Sie OnBind-Methode anstelle von Listener Callback verwenden müssen, siehe hier http://www.vogella.com/tutorials/AndroidServices/article.html –

Antwort

0

ich nicht ganz sicher bin, ob Rückrufe in einem Dienst verwendet, ist gegen Best-Practice und alles, aber was würde ich in Ihrer Situation tun wäre ein Konstruktor für MyGcmListenerService, der Ihren Listener als Parameter verwendet. Etwas wie das:

public MyGcmListenerService(newMessageListener listener){ 
     this.mListener = listener; 
    } 

So dass Sie einfach sofort nach der Initialisierung des Dienstes einstellen können. Ich würde immer noch den Setter für den Hörer behalten, nur für den Fall. Dann in den onMessageReceived, würde ich umfasse nur einen Null-checker, nur für den Fall, dass es keine Zuhörer Satz ist, etwa so:

if (mListener != null){ 
       mListener.newMessageArieved(); 
      } else { 
       Log.d(TAG, "No new message listener set."); 
      } 

Ihre Protokolle eine NPE zeigen, aber ich bin nicht so sicher, ob der Hörer verursacht es aber. Haben Sie einige Tests durchgeführt (Protokolle und ähnliches hinzufügen), um zu überprüfen, was genau die NPE verursacht? Versuchen Sie, das zu versuchen, was ich oben erwähnte, sehen Sie, ob es funktioniert. Viel Glück.

Verwandte Themen