onCancelled () кажется отличается от мороженого сэндвич - PullRequest
1 голос
/ 22 декабря 2011

Интересно, что случилось с IceCream Sandwich ...

У меня было простое AsyncTask чтение данных с сервера.Когда была нажата кнопка Disconnect , был вызван lServerTask.cancel(true);, который успешно вызывал onCancelled(), установив m_Running = false;, тем самым вырвав цикл while в protected void doInBackground(Void...params).

су меня Galaxy Nexus, я нажимаю кнопку отключения, но задача не выходит.И все еще подключен к серверу.У кого-нибудь есть идеи?

Большое спасибо

Марка

Код FYI -

        // automatically done on worker thread (separate from UI thread)
    protected Void doInBackground(Void...params) 
    {
        while(m_Running)
        {
            try 
            {
                lRDS.readSocket();
            } 
            catch (IOException e) 
            {
                lRDS.disconnectFromServer();
                publishProgress(e.toString());
                return null;
            }

            lDataBuffer = lRDS.getDataBuffer();    

            publishProgress(lDataBuffer);

        }
        return null;
    }

    @Override
    protected void onCancelled() 
    {
        m_Running = false;
        connectRDSButton.setEnabled(true);
        disconnectRDSButton.setEnabled(false);
    }

и со стороны интерфейса:

private class disconnectRDSButtonHandler implements View.OnClickListener
{        
    public void onClick(View v)
    {            
        editRobotData.setText("Disconnect...");
        if (lRobotDataServerTask.cancel(true) == true)
        {
            editRobotData.setText("Disconnected...");                
        }
    }        
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2012

Существует два подхода к отмене AsyncTask:

  • Проверка isCancelled внутри вашего doInBackground метода, чтобы попытаться завершиться как можно скорее.
  • Вызов cancel(true), тогда фоновый поток AsyncTask будет прерван.Чтобы это работало, вам нужно стратегически разместить Thread.sleep вызовы в вашем методе doInBackground, и когда вы поймаете InterruptedException, вы вернетесь.

Из этих двух подходовпоследний является наиболее ненадежным, поскольку любой вызов метода, перехватывающего InterruptedException, отличного от вашего, приведет к аннулированию отмены.Например, если вы вызываете метод, такой как SystemClock.sleep, который поглощает исключение, вы никогда не попадете в условие catch.

В обоих случаях длинные операции между isCancelled проверками или Thread.sleep вызовами будут выполняться до конца.

Теперь по вашему вопросу вы использовали второй подход, но не было никакого вызова Thread.sleep, поэтому он не будет работать, если только некоторые методы, которые вы вызываете, не перехватят исключение Interrupted и не сгенерируют исключение IOException.Вероятно, изменения в реализации от версии к другой имеют значение.

0 голосов
/ 22 февраля 2012

Хорошо, похоже, я нашел проблему. Мне нужно было проверить isCancelled () в цикле while метода doInBackground (), а затем вызвать метод onCancelled () оттуда. Не уверен, почему я не видел это как проблему на Android 2.2 на HTC desire.

protected Void doInBackground(Void...params)

{

while(m_Running)
{
    if (isCancelled () == true)
    {
        onCancelled();
    }

Надеюсь, это кому-нибудь поможет.

Mark

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