2016-04-13 14 views
0

Ich habe eine Reihe von APIs, die mit AsyncTask implementiert werden. Einige von ihnen haben unterschiedliche Signaturen (einige haben Fortschrittsberichte, andere haben unterschiedliche Datentypen, die als Params gesendet werden). Alle diese APIs geben jedoch ein boolesches Ergebnis zurück. Bei Erfolg ist die App Logic für den erfolgreichen Aufruf der API fertig. Bei einem Fehler wird ein generisches Fehler-Popup mit einer Fehlermeldung angezeigt. Nun möchte ich eine Klasse aus AsyncTask so ableiten, dass sie sowohl eine Funktion onSuccessResult implementiert als auch eine Funktion onFailureResult überschreibt.Ableiten async Aufgabe in Android

Bitte beachten Sie, dass ich all dies mit zwei generischen Datentypen Params und Progress tun muss. Wie kann ich das erreichen? Ich möchte das aus zwei Gründen erreichen. Zuerst möchte ich von dieser neuen Klasse wie folgt abzuleiten:

public class getCarDetailAPITask extends ServerAPIAsyncTask<Garage, void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     //call my api 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 
     super.onPostExecute(success); 
    } 

    @Override 
    public void onFailureResult() { 
     super.onFailureResult(); 
    } 

    @Override 
    public void onSuccessResult() { 
     //Do app logic 
    } 
} 

Zweitens ist es mir hilft, damit die onFailureResult Logik an einem Ort zu halten, es nicht immer und immer wieder zu wiederholen.

+1

Was ist das Problem genau? Rufen Sie einfach die entsprechende Methode von 'onPostExecute()' abhängig von dem dort empfangenen 'Boolean'-Wert auf. –

+0

@MikeM. : Ich habe die Frage aktualisiert. Bitte gehen Sie es durch. – tinutomson

+0

@ cricket_007: aktualisiert. – tinutomson

Antwort

0

Für Params, Progress und Result müssen Sie in tatsächlichen Klassen übergeben, wenn Sie AsyncTask erweitern. Da Sie keine Klassen in Ihrem Klassenpfad haben, die den Namen Params und Progress entsprechen, erhalten Sie diese Fehler.

public class ServerAPIAsyncTask extends AsyncTask<Void, Void, Boolean>{ 

    abstract public void onSuccessResult(); 
    public void onFailureResult() { 
     int err = getErrorCode(); 
     showPopup(err); 
    } 

    protected void onPostExecute(final Boolean success) { 
     if (success) 
     onSuccessResult(); 
     else 
     onFailureResult(); 
    } 


} 

Für Ihre zweite AsyncTask sollten Sie AsyncTask, nicht Ihren eigenen abgeleiteten ServerAPIAsyncTask erweitern. Auch Garage der erste Parameter muss den Parameter, den Sie in doInBackground passieren übereinstimmen, siehe unten:

public class GetCarDetailAPITask extends AsyncTask<Garage, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Garage... params) { 
    //call my api 
    } 

    protected void onPostExecute(final Boolean success) { 
     super.onPostExecute(success); 
    } 

    @Override 
    public void onFailureResult() { 
     super.onFailureResult(); 
    } 

    @Override 
    public void onSuccessResult() { 
     //Do app logic 
    } 
} 
+0

Wenn ich von AsyncTask erben, habe ich nicht onFailureResult zu überschreiben oder OnSuccessResult() implementiert werden. Das bedeutet, dass ich jedes Mal, wenn ich eine neue API erweitere, viel Code wiederholen muss, den ich bei onFailureResult habe. – tinutomson

+0

Wenn Sie von Ihrer anderen AsyncTask erben, können Sie die Typen von Params, Progress und Result nicht ändern. Um Ihre Rückrufe zu tun, können Sie eine Schnittstelle wie in diesem Beispiel verwenden: http://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui Ich verstehe nicht, warum Sie zwei Methoden in Ihrem benötigen asynctask, obwohl. Sie können einfach das, was Sie auf dem UiThread benötigen, von onPostExecute aus aufrufen – barq

0

nach Ihren Kommentar, da haben Sie generische AsyncTask Beispiel:

public class MyAsyncTask<A,B> extends AsyncTask<A, Void, B> { 

    @Override 
    protected B doInBackground(A... params) { 
     return null; 
    } 

    // Other methods 
} 
0

Sie sagten, diese

//I get error Params, Progress not recognized. 
public class ServerAPIAsyncTask extends AsyncTask<Params, Progress, Boolean> 

Params und Progress sind keine echten Klassen. Sie müssen echte Klassen in Ihrem Paket sein.

Einige von ihnen haben unterschiedliche Signatur (Einige haben Fortschrittsberichte, einige andere haben unterschiedliche Datentypen als Params gesendet).

Unterschiedlicher Datentyp wird als Parameter gesendet? Stellen Sie also Parameter auf Object ein. Es ist die Oberklasse aller Klassen.

dieses Beispiel Siehe, von AsyncTask Dokumentation entnommen selbst:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
    showDialog("Downloaded " + result + " bytes"); 
    } 
}