Как реализовать асинхронный запрос http-post в Android? - PullRequest
2 голосов
/ 09 апреля 2010

Я хотел бы реализовать следующий простой шаблон в приложении для Android:

  1. Задание A начинает задание B
  2. В упражнении B пользователь заполняет простую форму F, затем нажимает на кнопку отправить
  3. Действие B затем запускает AsyncTask C, который отправляет F на URL-адрес, и сразу же возвращается к Занятости A
  4. Вернувшись к действию A, пользователь продолжает вести обычную работу, пока C все еще работает. Но как только C завершен, пользователь должен быть уведомлен, в частности, если результатом был сбой.

У меня проблема с шагами 3 и 4. Так как C запускается B, как A может получать уведомления? Хм, не уверен, понятно ли это кому-либо, кроме меня ...

Во всяком случае, сейчас я застрял с решением, где вместо этого шаг 3 выглядит следующим образом:

3 ". Упражнение B возвращает содержимое формы в занятие A. A, затем запускает AsyncTask C для отправки формы и продолжает работу как обычно.

Но просто кажется немного ненужным, что А также должен обрабатывать форму, это просто обязанность Б. Какие-нибудь другие идеи или решения существуют?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

Я бы использовал вещательный приемник. http://d.android.com/reference/android/content/BroadcastReceiver.html

В Деятельности B

Intent broadcastIntent = new Intent("com.yourapppackage.BROADCAST");
broadcastIntent.putExtra("myExtras", myExtras.extra); // Put your results in here
sendBroadcast(broadcastIntent);

Запустите это из onPostExecute вашей AsyncTask.

В манифесте приложения добавьте фильтр намерений к вашей активности. http://developer.android.com/guide/topics/manifest/intent-filter-element.html

<activity android:name=".A"
>
    <intent-filter>
        <action android:name="com.yourapppackage.BROADCAST" />
    </intent-filter>
</activity>

Регистрация BroadcastReceiver в действии A http://developer.android.com/reference/android/content/BroadcastReceiver.html

// Set up a handler and a broadcast reciever
private final Handler mHandler = new Handler();
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
        public void onReceive(Context context, Intent intent) {
            // Handle reciever
            String mAction = intent.getAction();

            if(mAction.equals("com.yourapppackage.BROADCAST")) {
            // Do something with the results - intent.getExtras();
        }
    }
}

// Register a reciever
IntentFilter myRecieverIntentFilter = new IntentFilter();
myRecieverIntentFilter.addAction("com.yourapppackage.BROADCAST");
this.registerReceiver(mIntentReceiver, myRecieverIntentFilter, null, mHandler);
1 голос
/ 16 сентября 2011
0 голосов
/ 09 апреля 2010

Почему бы B не получить информацию, необходимую для выполнения задачи, а затем передать ее обратно A? OnPreExecute () и onPostExecute () происходят в основном потоке действия A.

Неважно, я только что видел это в вашем описании. Но да - B обрабатывает все это - A просто передает данные в URL.

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