Android: Данные из трансляции из AsyncTask не проходят через данные

#android

#Android

Вопрос:

Я использую намерение транслировать данные из потока AsyncTask обратно в основное действие. Трансляция моего действия принята без проблем, но я не вижу данных Uri или последовательности символов. Они оба равны нулю.

На стороне службы в AsyncTask:

    public static final String LOCATION_UPDATE = "com.locationTest.lct.LOCATION_UPDATE";
   char[] buffer = new char[10];
   buffer[0] = 't';
   buffer[1] = 'e';
   buffer[2] = 's';
   buffer[3] = 't';

   Intent intent = new Intent(LOCATION_UPDATE);
   intent.putExtra("location",buffer);
   sendBroadcast(intent);
  

На стороне активности в основном классе активности:

 public static final String LOCATION_UPDATE = "com.locationTest.lct.LOCATION_UPDATE";
   public class LocationBroadcastReceiver extends BroadcastReceiver {
       public void onReceive(Context context,Intent intent)
       {
        Uri data = intent.getData();
        CharSequence location = intent.getCharSequenceExtra("location");
    }
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    iService = startService(new Intent(this,InputService2.class));
    IntentFilter filter = new IntentFilter(LOCATION_UPDATE);
    LocationBroadcastReceiver r = new LocationBroadcastReceiver();
    registerReceiver(r,filter);  
  

Ответ №1:

Это может быть потому, что вы создаете массив символов, а затем пытаетесь получить его в виде последовательности символов. Попробуйте с

 String location = new String(intent.getCharArrayExtra("location"));
  

или что-то подобное, чтобы вы использовали правильный метод get из намерения.

Комментарии:

1. Нет, я заменил вышеупомянутое на char[] location = intent.getCharArrayExtra («местоположение»); и я все еще получаю null. Кроме того, URI также равен null, поэтому проблема вызвана чем-то в настройках.

2. Я нашел это. Я запускал службу перед инициализацией широковещательного приемника. Тогда служба отправила бы первое сообщение (при запуске) до того, как приемник был полностью инициализирован. Ответ заключается в том, чтобы сначала инициализировать приемник, а затем службу. По сути, это было условие гонки между задачей asyc и основным потоком.

3. Ах, я должен был заметить это. Я должен упомянуть, что обычной практикой является регистрация получателя в onResume, а отмена регистрации находится в onPause.