2014-02-19 2 views
1

я столкнулся вопрос с отменой моего AsyncTask ..Отменяя AsyncTask

Я думаю, что моя проблема может быть простой, но я не могу понять, как его код.

Я использую

while(!isCancelled())

в моей doinbackground, но проблема в том, что AsyncTask никогда не загружает на пост выполнить и единственный способ прервать это нажать кнопку отмены на моем диалоге прогресса.

мне нужно, если я нажмите кнопку, чтобы отменить AsyncTask отменить, и если я не нажимал отменить это должно действовать нормально (где! Проверка isCancelled() никогда не срабатывает)

поэтому он никогда не заканчивается нормально ,

protected Void doInBackground(Void... params) { 
     // Create the array 

     while(!isCancelled()) 
     { 

      UsersPostsGet = new ArrayList<UsersPostsGet>(); 
      try { 
       // Locate the class table named "Country" in Parse.com 
       ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
         mainroadfrom.replace(" ", "") 
           + mainroadto.replace(" ", "")); 
       // Locate the column named "ranknum" in Parse.com and order list 
       // by ascending 
       // 

       Date midnight = new Date(); 
       midnight.setHours(0); 
       midnight.setMinutes(0); 
       midnight.setSeconds(0); 

       Date elevenfiftynine = new Date(); 
       elevenfiftynine.setHours(23); 
       elevenfiftynine.setMinutes(59); 
       elevenfiftynine.setSeconds(59); 

       query.whereGreaterThan("createdAt", midnight); 
       query.whereLessThan("createdAt", elevenfiftynine); 
       query.orderByDescending("createdAt"); 

       Time dtNow = new Time(); 
       dtNow.setToNow(); 

       ob = query.find(); 
       for (ParseObject country : ob) { 

        int hoursnow = new Date().getHours(); 
        int minsnow = new Date().getMinutes(); 

        int sumnow = hoursnow * 60 + minsnow; 

        int hourspost = country.getCreatedAt().getHours(); 
        int minspost = country.getCreatedAt().getMinutes(); 

        int sumpost = hourspost * 60 + minspost; 

        int total = sumnow - sumpost; 

        int i = total/60; 
        int j = total % 60; 

        if (i == 0) { 
         if (j <= 1) { 
          x = j + " Minute"; 
         } 

         else { 
          x = j + " Minutes"; 
         } 
        } 

        else { 
         if (j <= 1) { 
          x = i + " Hour " + j + " Minute"; 
         } 

         else { 
          x = i + " Hours " + j + " Minutes"; 
         } 
        } 

        ParseFile image = (ParseFile) country.get("imageattach"); 

        UsersPostsGet map = new UsersPostsGet(); 
        map.setUsername((String) country.get("username")); 
        map.setUserpost((String) country.get("userpost")); 
        map.setId((String) country.getObjectId()); 
        map.setStatus((String) country.get("status")); 
        map.setReport((String) country.get("report")); 
        map.setDisplayname((String) country.get("displayname")); 

        map.setPosttime(x); 

        if (image == null) { 
         map.seturl(""); 
        } 

        else { 
         map.seturl(image.getUrl()); 
        } 

        map.setIdpost(mainroadfrom.replace(" ", "") 
          + mainroadto.replace(" ", "")); 

        UsersPostsGet.add(map); 


       } 
      } catch (ParseException e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 

    } 

     return null; 
    } 

Мой код отмены

mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
       "Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 

         RemoteDataTask.this.cancel(true); 
        } 
       }); 
+0

Где код? – nKn

+0

Я добавил его в сообщение ... моя проблема в том, что моя асинтеза никогда не заканчивается нормально для моего выполнения после выполнения, и я должен нажать кнопку отмены в своем диалоговом окне Alert, чтобы отменить ее. –

+0

Вы также должны указать код 'isCancelled()', чтобы узнать, как вы обрабатываете отмену этого цикла. – nKn

ответ

1

У вас есть код в цикле, который возвращает значение boolean, но он возвращает true (и поэтому вы выходите из цикла), если вы отменили AsyncTask. Я думаю, что то, что вы пытаетесь достичь, похоже на это, но при условии, что вы должны хотите контролировать, когда выходить. Таким образом, вы должны определить свои собственные boolean значение класса шириной, например, определить:

boolean dontExit = true; 

Затем измените петлю на:

while (!dontExit) { 
    // Your code 
    ... 
} 

Где-то в вашем коде, должно быть какое-то условие, чтобы сделать что dontExit значение как ложное, поэтому вам нужно реализовать некоторую логику внутри цикла, чтобы определить , когда для выхода. Например:

if (number_of_loop_processing > 200) 
    dontExit = false; 

Это сделает ваш конец цикла и перейти к onPostExecute() кода.

Разница в том, что в настоящее время, то isCancelled() вызывается, когда, как его имя обозначает, то AsyncTask «s doInBackground() полностью отменен, так что выходит и прыгает на onCancelled() событие, но это происходит только тогда, когда вы отмените это так вы не можете добавить к нему свою собственную логику.

+0

Я постараюсь реализовать этот способ и посмотреть, работает ли он. Спасибо за вашу помощь! –

+1

** «полностью отменен, поэтому он выходит и переходит к onPostExecute()» ** - Если «AsyncTask» отменяется, 'onPostExecute (...)' никогда не вызывается - вместо этого 'onCancelled (...)' вызывается , – Squonk

+1

Правильно! Исправлено, спасибо. – nKn

1

При вызове cancel метод, onCancelled метод вашего AsyncTask выполняется, так что, как вы можете различать, что произошло. Сохраните ссылку на ваш AsyncTask и вызовите его метод отмены, когда нажата кнопка в диалоговом окне, и это должно сделать трюк.

Из документации:

Задача может быть отменена в любой момент, вызвав отмены (булево). Вызов этого метода приведет к последующим вызовам isCancelled(), чтобы вернуть true. После вызова этого метода onCancelled (Object) вместо onPostExecute (Object) будет вызываться после того, как doInBackground (Object []) вернется. Чтобы гарантировать, что задача будет отменена как можно быстрее, вы всегда должны проверять возвращаемое значение isCancelled() периодически из doInBackground (Object []), если это возможно (например, внутри цикла).

+0

Спасибо Ameen. моя проблема заключается в том, что моя асинтеза никогда не заканчивается нормально, чтобы выполнить пост, и я должен нажать кнопку отмены в моем диалоговом окне Alert, чтобы отменить ее (чтобы сделать проверку while правильной). –

Смежные вопросы