Как да изчакате Asynctask и да отхвърлите ProgressDialog?

Имам проблем и се надявам да ми помогнете. Имам Asynctask, който започва да качва данни, ако натисна бутон в основната си дейност. Работи добре, освен ако имам бавна интернет връзка. Asynctask стартира диалогов прозорец за напредък и ако имам бавна връзка, Asynctask спира, но диалоговият прозорец Progressdialog не изчезва, защото никога не е достигал 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) в края? Задължително ли е или може да се премахне? работи за моите нужди btw. - person publicknowledge; 10.12.2015
comment
@publicknowledge Това ще приспи фоновата нишка за 100 ms. Необходимостта ще зависи от това, което правите. Ако имате нужда нишката да заспи, за да дадете време на други неща да завършат, тогава тя ще работи за това. Знайте, че това ще спре тази нишка за толкова време, поради което обикновено не искате да я използвате в основната нишка. Пр. може би кодът в цикъла има достъп до вътрешно устройство и трябва да му дадете време да направи нещо, преди да проверите отново. Радвам се, че ти е подействало :) - person codeMagic; 10.12.2015