Android Honeycomb: фрагмент не может запустить AsyncTask?

Раньше я сталкивался с этой ошибкой, но подумал, что это какая-то ошибка системы строгого режима. Однако, по-видимому, это было правильно, как я с грустью узнал сейчас. :(

Моя программа состоит из одного действия и множества фрагментов. У меня есть фрагмент 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 с фрагментами? Или я что-то не так сделал?

Спасибо за помощь, медуза


person jellyfish    schedule 20.06.2011    source источник
comment
Вы проверили вывод журнала cat?   -  person Flo    schedule 20.06.2011
comment
Есть только исключение, которое я сам ловлю и печатаю в журнал.   -  person jellyfish    schedule 20.06.2011


Ответы (1)


Не вызывайте doInBackground напрямую, вместо этого вызывайте execute (в асинхронной задаче)

person smith324    schedule 20.06.2011
comment
Ооооо, я такая дура, спасибо! Надо было повнимательнее взглянуть на приложение для смартфона. ;) - person jellyfish; 20.06.2011