2017-04-06 1 views
0

Je travaille avec l'API Google Calendar et suis coincé avec AsyncTask. OnPostExecute ne peut pas être appelé si j'utilise la classe abstraite.OnPostExecute n'est pas appelé dans AsyncTask <Void, Void, Boolean> avec la classe abstraite

MakeRequestTask.java

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.util.Log; 

import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServicesAvailabilityIOException; 
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; 

import java.io.IOException; 
import java.util.List; 

abstract class MakeRequestTask extends AsyncTask<Void, Void, Boolean> { 
private String TAG = "MakeRequestTask"; 

final MainActivity mainactivity; 
final com.google.api.services.calendar.Calendar mService; 
private Exception mLastError = null; 

ProgressDialog loading = null; 

//Calendar service; 
MakeRequestTask(MainActivity mainactivity) { 
    this.mainactivity = mainactivity; 
    this.mService = mainactivity.mService; 

    loading = new ProgressDialog(mainactivity); 
    loading.setCancelable(true); 
    loading.setMessage("Sync with Google Calendar"; 
    loading.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    Log.i(TAG, "onPreExecute"); 
    mainactivity.numAsyncTasks++; 
    loading.show(); 
} 


@Override 
protected final Boolean doInBackground(Void... ignored) { 
    Log.i(TAG, "doInBackground"); 
    try { 
     doInBackground(); 
     return true; 
    } catch (final GooglePlayServicesAvailabilityIOException availabilityException) { 
     mainactivity.showGooglePlayServicesAvailabilityErrorDialog(
       availabilityException.getConnectionStatusCode()); 
    } catch (UserRecoverableAuthIOException userRecoverableException) { 
     mainactivity.startActivityForResult(
       userRecoverableException.getIntent(), MainActivity.REQUEST_AUTHORIZATION); 
    } catch (IOException e) { 
     //Utils.logAndShow(activity, MainActivity.TAG, e); 
     Log.i(TAG, "IOException" + e); 
    } 
    return false; 
} 

@Override 
protected final void onPostExecute(Boolean success) { 
    super.onPostExecute(success); 
    Log.i(TAG, "onPostExecute"); 
    loading.cancel(); 
    if (0 == --mainactivity.numAsyncTasks) { 
    } 
    if (success) { 
    } 
} 


abstract protected void doInBackground() throws IOException; 

} 

AsyncLoadEvent.java (un de la classe abstraite)

import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.util.Log; 

import com.google.api.client.util.DateTime; 
import com.google.api.services.calendar.model.Event; 
import com.google.api.services.calendar.model.Events; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

class AsyncLoadEvent extends MakeRequestTask { 
private String TAG = "AsyncLoadEvent"; 

AsyncLoadEvent(MainActivity mainActivity) { 
    super(mainActivity); 
    this.mainActivity = mainActivity; 
} 

@Override 
protected void doInBackground() throws IOException { 
    Log.i(TAG, "doInBackground"); 
    try { 
     ...... 
    } catch (Exception e) { 
     Log.i(TAG, "Exception" + e); 
     cancel(true); 
    } 
} 
} 

Comme vous pouvez le voir sur cette question, si je ne me classe abstraite et changer la AsyncTask java à comme suit, onPostExecute sera appelé.

... 
@Override 
protected final Boolean doInBackground(Void... ignored) { 
    Log.i(TAG, "doInBackground"); 
    return true; 
} 
... 

Je suis vraiment apprécier si quelqu'un pouvait signaler toute erreur dans mon code, même en double solution sera agréable, aussi longtemps que fournir une explication claire ou un guide.

Si vous voulez plus de code dans ma classe abstraite, je le ferai.

Répondre

0

Ok, j'ai trouvé le problème après quelques travaux. c'était lié à ma classe abstraite.

AsyncLoadEvent.java (un de la classe abstraite)

@Override 
protected void doInBackground() throws IOException { 
    Log.i(TAG, "doInBackground"); 
    try { 
     getDataFromApi(); 
    } catch (Exception e) { 
     Log.i(TAG, "Exception : " + e); 
     cancel(true); 
     Log.i(TAG, "cancel(true)"); 
    } 
} 

La classe a été sauté dans l'exception et exécutez « annuler (true) » parce que je l'ai essayé de mettre à jour les composants de l'interface utilisateur dans « getDataFromApi() », et il n'appellerait alors pasPostExecute().

J'ai cherché dans la méthode Override dans la classe AsyncTask et trouvé onCancelled() est disponible. Et a vu un thread dit:

appel de cette méthode se traduira par onCancelled (Object) invoquée sur le thread d'interface utilisateur après doInBackground (Object []) les retours. L'appel de cette méthode garantit que onPostExecute (Object) n'est jamais appelé. Après invoquant cette méthode, vous devez vérifier la valeur retournée par isCancelled() périodiquement à partir de doInBackground (Object []) pour terminer la tâche le plus tôt possible.