Раньше я сталкивался с этой ошибкой, но подумал, что это какая-то ошибка системы строгого режима. Однако, по-видимому, это было правильно, как я с грустью узнал сейчас. :(
Моя программа состоит из одного действия и множества фрагментов. У меня есть фрагмент NetworkWorker, который запускает URL-запросы следующим образом:
public void startURLRequest(Fragment target, String url, String message)
{
if (asyncTask != null) asyncTask.cancel(true);
asyncTask = new FragmentHttpHelper(url, message, target);
asyncTask.doInBackground();
return;
}
FragmentHttpHelper — это собственный внутренний класс, производный от AsyncTask:
private class FragmentHttpHelper extends AsyncTask<Void, Void, String>
{
//...
@Override
protected String doInBackground(Void... params)
{
if (CheckInternet())
{
try
{
URL myURL = new URL(url);
httpClient = new DefaultHttpClient();
if (this.message == null)
{
httpRequest = new HttpGet(myURL.toExternalForm());
}
else
{
httpRequest = new HttpPost(myURL.toExternalForm());
HttpEntity myEntity = new StringEntity(message, "UTF-8");
((HttpPost) httpRequest).setEntity(myEntity);
}
// and so on...
}
//catches
finally
{
// auf jeden Fall Verbindung beenden
if (httpRequest != null) httpRequest.abort();
// if (httpClient != null) httpClient.close();
}
}
else
{
showDialog(getString(R.string.net_notify_no_network), target);
}
//...
}
/**
* gets called after AsyncTask has finished
*/
protected void onPostExecute(String result)
{
if (target == null)
{
((NetworkWorkerListener) getActivity()).onDownloadHasFinished((!result.contentEquals(ERROR)), result);
}
else
{
((NetworkWorkerListener) target).onDownloadHasFinished((!result.contentEquals(ERROR)), result);
}
}
}
NetworkWorkerListener — это просто интерфейс для обратного вызова фрагмента, который запустил запрос URL. Этот класс всегда работал нормально, когда я использовал его в своем приложении 2.2. Тогда я бы получил это в своей деятельности.
Теперь, если выбран пункт меню, другой рабочий фрагмент запускает запрос URL-адреса с помощью вышеуказанного метода и открывает диалоговое окно загрузки:
FragmentManager fragmentManager = getFragmentManager();
NetworkWorker network = (NetworkWorker) fragmentManager.findFragmentByTag(TabletMain.NETWORK);
if (network == null) return WorkerFeedback.NO_NETWORK_WORKER;
myDialog = LoadingDialog.createInstance(getString(R.string.notify_download), this);
myDialog.show(fragmentManager, TabletMain.ONETIME);
network.startURLRequest(this, someurl, null);
По крайней мере, так должно было случиться. Вместо этого, когда я нажимаю элемент меню, мое приложение зависает, и до тех пор не отображается диалоговое окно загрузки. Далее происходит реакция на окончание загрузки (или, в моем случае, сообщение об ошибке, так как я отправляю бессмысленные строки). Значение onPostExecute() было достигнуто.
Сейчас я чувствую себя действительно застрявшим - нельзя ли использовать AsyncTask с фрагментами? Или я что-то не так сделал?
Спасибо за помощь, медуза