Просто для краткого, рабочего примера, чтобы увидеть эффект их различия
new Thread(foo).Start();
private void foo()
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate()
{
myTextBox.Text = "bing";
Thread.Sleep(TimeSpan.FromSeconds(3));
});
MessageBox.Show("done");
}
Если использовать BeginInvoke , MessageBox выскакивает одновременно с обновлением текста. Если использовать Invoke , MessageBox выскакивает после 3-секундного сна. Отсюда показано влияние асинхронного ( BeginInvoke ) и синхронного ( Invoke ) вызова.
Похоже, что Android использует стандартную реализацию в памяти, поэтому вам нужно будет создать свой собственный постоянный куки-магазин.
В этом руководстве по Java описывается создание собственного постоянного хранилища с использованием реализации по умолчанию. http://download.oracle.com/javase/tutorial/networking/cookies/custom.html
В примере есть два задания для хранения (чтение / запись). Для хранения я бы просто используйте SharedPreferences для хранения только необходимого cookie-файла сеанса и не сохраняйте другие.
В примере используется хук отключения, который не подходит для Android. Вместо run () и ловушки у меня просто был бы новый публичный метод persist (), который сохраняет то, что вы хотите, хотя и требует, чтобы вы сохраняли () хранилище вручную.
Учитывая, что у вас есть только один или два файла cookie, которые имеют значение, вы можете сохранить их в дополнении (...)
После того, как вы сделаете ваш http-вызов, вы можете получить cookie-файлы следующим образом
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
Log.d(TAG,"no cookies received");
} else {
for (int i = 0; i < cookies.size(); i++) {
if(cookies.get(i).getName().contentEquals("PHPSESSID")) {
PHPSESSID = cookies.get(i).getValue();
}
}
}
Чтобы отправить их обратно:
nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
httppost.setEntity(new UrlEncodedFormEntity(aList));
aList - все ваше имяValuePairs