Как отключить Asynctask и закрыть ProgressDialog?

У меня проблема, и я надеюсь, что вы можете мне помочь. У меня есть асинтаск, который начинает загружать данные, если я нажимаю кнопку в своей основной деятельности. Он работает нормально, за исключением случаев, когда у меня медленное подключение к Интернету. Asynctask запускает диалоговое окно прогресса, и если у меня медленное соединение, Asynctask останавливается, но диалоговое окно Progress не исчезает, потому что оно никогда не достигало onPostExecute.

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

Вот мой код:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        time = System.currentTimeMillis();

        Log.d(TAG, "PBar: Hat gestartet");
        if (MainActivity.MessungStart == true)
            {
        ConnectionTask.dialog = new ProgressDialog(MainActivity.context);

        ConnectionTask.dialog.setMessage("Daten werden hochgeladen...");
        dialog.setCanceledOnTouchOutside(false);
        ConnectionTask.dialog.show();    
            }
    }

protected Void doInBackground(String... args) {

        mUser = MainActivity.username; 
        mPassword = MainActivity.password;  
        Log.d(TAG,"Async: User= "+mUser+" Password= "+mPassword);

        Timer t = new Timer();
        TimerTask tk = new TimerTask() {

              @Override
                public void run() {
                    timeout = true;
                }
            };
         t.schedule(tk, 100);
         if(timeout == true)
         {
             Log.d(TAG, "TimeOut = true");
             onPostExecute(null);
         }

        try {
            authenticate();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        {
            try {
                sendData();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(temp!= null)
        {
        try {
            ReceiveMessageState();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
        Sendungfertig = true;   
        if(MainActivity.asyncIsCanceled == true)
        {
            if (ConnectionTask.dialog.isShowing() == true) 
            {
             ConnectionTask.dialog.dismiss();
            }
        }
        isCancelled();
        return null;
   }

@Override
protected void onPostExecute(Void v) {
    super.onPostExecute(v);
    Log.d(TAG, "PBar: Sollte enden");
    if(MessageChecked==true)
    {
    if (ConnectionTask.dialog.isShowing() == true) 
    {
     ConnectionTask.dialog.dismiss();
    }


    if(isCancelled()==true)
    {
    if (ConnectionTask.dialog.isShowing() == true) 
    {
     ConnectionTask.dialog.dismiss();
    }
    MessageChecked = false;
    MainActivity.MessungStart = false;
    }
    }
}

person Har Un    schedule 22.09.2013    source источник


Ответы (1)


Согласно документации

Не вызывайте onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) вручную.

вместо того, чтобы делать

if(timeout == true)
     {
         Log.d(TAG, "TimeOut = true");
         onPostExecute(null);  // this should be removed

просто return null там вместо этого. Это вернет управление onPostExecute(), где вы сможете закрыть свой Dialog.

Изменить

Я думаю, что вы слишком усложняете TimerTask в этой ситуации, потому что все будет продолжать работать. Что вы можете сделать, так это использовать while loop и счетчик для любого времени, которое вы хотите. Так что-то вроде

long waitTime = 1000;  // or whatever you want the timeout length to be
long curWaitTime = 0;
while (!timeout && curWaitTime < waitTime)
{
    // put your network/file code here
    // if the data finishes then you can set timeout to true
    curWaitTime += 100; // or some other value to add
    Thread.sleep(100);
}
return null;
person codeMagic    schedule 22.09.2013
comment
Спасибо за Ваш быстрый ответ. Как вы можете видеть в коде, я установил time.schedule на 100, поэтому я предполагаю, что тайм-аут произойдет сразу после запуска. но это не так. он отправляет все файлы. В моем текущем местоположении я не могу имитировать медленное интернет-соединение... Разве в фоновом режиме не проверяется, сколько времени прошло? - person Har Un; 22.09.2013
comment
что это за Thread.sleep(100) в конце? Это обязательно или можно убрать? это сработало для моих нужд, кстати. - person publicknowledge; 10.12.2015
comment
@publicknowledge Это усыпит фоновый поток на 100 мс. Необходимость будет зависеть от того, что вы делаете. Если вам нужно, чтобы поток заснул, чтобы дать другим делам время для завершения, он сработает для этого. Знайте, что это затянет этот поток на это время, поэтому вы обычно не хотите использовать его в основном потоке. Бывший. возможно, код в цикле обращается к внутреннему устройству, и вам нужно дать ему время, чтобы что-то сделать, прежде чем проверять снова. Я рад, что это сработало для вас :) - person codeMagic; 10.12.2015