1

Ваша помощь очень ценится, Мое приложение продолжает сбой, когда я получаю уведомление GCM push, он падает, когда я пытаюсь обновить свой списокView, вот полный код:Android: обновить ListView на GCM получил сбой мое приложение

GCM класс (полное):

public class MyGcmListenerService extends GcmListenerService { 

private static final String TAG = "MyGcmListenerService"; 

/** 
* 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) { 
    String message = data.getString("m"); 
    Log.d(TAG, "From: " + from); 
    Log.d(TAG, "Message: " + message); 

    if(myDbHelper.checkDataBase()) { 
     DataBaseHelper gsh = new DataBaseHelper(getApplicationContext()); 
     gsh.getSQLiteHistory(); 
    } 

    sendNotification(message); 

} 
// [END receive_message] 

/** 
* Create and show a simple notification containing the received GCM message. 
* 
* @param message GCM message received. 
*/ 

private void sendNotification(String message) { 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_stat_ic_notification) 
      .setContentTitle("my alert") 
      .setContentText(message) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
} 
} 

и из класса SQL я называю "новая AlertsList() GCMRefresh (rowItems);"

Теперь, когда у меня есть список пунктов, я называю GCMRefresh в AlertList Класс:

public void GCMRefresh(List<RowItem> rowItems) 
{ 
    adapter = new CustomListViewAdapter(this.getActivity(), 
       R.layout.list_item, rowItems); //CRASH HERE 
    mList.setAdapter(adapter); 
} 

Добавлено AlertList Класс: общественный класс AlertsList расширяет фрагмент реализует OnTaskCompleted {

... 
public void setContext(Context context){ 
    mContext = context; 
} 

public AlertsList getListener(){ 
    return this; 
} 

ArrayList<String> title_array = new ArrayList<String>(); 
ArrayList<String> notice_array = new ArrayList<String>(); 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    setHasOptionsMenu(true); 

    View v = inflater.inflate(R.layout.alerts_list, container, 
      false); 
    mList = (ListView) v.findViewById(R.id.list); 

    DataBaseHelper myDbHelper = new DataBaseHelper(this.getContext()); 
    if(myDbHelper.checkDataBase()) { 
     getSQLiteHistory(); 
    } 

    return v; 
} 

CustomListViewAdapter Класс:

public class CustomListViewAdapter extends ArrayAdapter<RowItem> { 

    Context context; 

    public CustomListViewAdapter(Context context, int resourceId, 
           List<RowItem> items) { 
     super(context, resourceId, items); 
     this.context = context; 
    } 

    /*private view holder class*/ 
    private class ViewHolder { 
     ImageView imageView; 
     TextView txtTitle; 
     TextView txtDesc; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     RowItem rowItem = getItem(position); 

     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item, null); 
      holder = new ViewHolder(); 
      holder.txtDesc = (TextView) convertView.findViewById(R.id.desc); 
      holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.icon); 
      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     holder.txtDesc.setText(rowItem.getDesc()); 
     holder.txtTitle.setText(rowItem.getTitle()); 
     holder.imageView.setImageResource(rowItem.getImageId()); 

     return convertView; 
    } 
} 

Итак, как я могу обновить свой списокView, не отключая мое приложение?

Здесь ошибка аварии: Попытки вызвать виртуальный метод «java.lang.Object android.content.Context.getSystemService (java.lang.String)» на нулевую ссылку на объект отправки сообщения в обработчике на мертвой нити.

спасибо !!

Eran.

+0

вы можете оставить код GCM Class? Я думаю, что контекст, который вы передаете адаптеру, недействителен. –

+0

this.getActivity() имеет значение null в вашем GCMRefresh(), размещает некоторый код, где вы его определяете. – harshitpthk

+0

@ user1992200 Благодарю вас! M опубликовано GCM Код класса –

ответ

0

Благодаря @Dinesh Kannan, вот ответ: this.getActivity() равна нулю в CustomListViewAdapter (this.getActivity()) После того как я получил mContext все работает:

adapter = new CustomListViewAdapter(mContext,R.id.list,rowItems); 
Смежные вопросы