2016-08-20 5 views
-2

Ich habe eine AsyncTask GoogleBookAsyncTask, die ich in einem Fragment ausführen möchte. Ich folge diesem anderen SO post. Es erfordert meine Fragment-Klasse BookListingActivityFragment, um eine Schnittstelle AsyncResponse zu implementieren und seine abstrakte Methode onProcessFinish() zu deklarieren.Als innere Klasse deklariert, aber Fehler "muss abstrakt erklärt oder implementiert werden" persistent

Die onProcessFinish() in meinem Fragment ist als anonymer Klassenleben folgenden zu erklären.

public GoogleBookAsyncTask mGoogleBookAsyncTask = new GoogleBookAsyncTask(new AsyncResponse() { 
    @Override 
    public void processFinish(ArrayList<Book> bookArrayList) { 
     mBookArrayAdapter.clear(); 
     mBookArrayAdapter = new BookAdapter(getContext(), bookArrayList); 
     mBookArrayAdapter.notifyDataSetChanged(); 
    } 
}); 

Ich erhalte einen Fehler must either be declared abstract or implement abstract method. Dieser Fehler verschwindet, wenn ich processFinish() als eine reguläre nicht-innere Klasse deklariere. Wie kann ich diesen Fehler beheben? Ich brauche führen Sie mGoogleBookAsyncTask.execute() aus, um Daten von meiner AsyncTask Klasse zu erhalten.

Der vollständige Quellcode meiner App kann here gefunden werden.

+1

"Dieser Fehler verschwindet, wenn ich onProcessFinish() als eine normale nicht-innere Klasse deklariere" - 'onProcessFinish()' ist eine Methode. Es ist keine Klasse. "Der vollständige Quellcode meiner App kann hier gefunden werden." - In diesem Repository gibt es keine AsyncTask. Es gibt auch keine "GoogleBookAsyncTask" oder "AsyncResponse". Bitte geben Sie eine [mcve] ein, einschließlich des Quellcodes für "GoogleBookAsyncTask" und "AsyncResponse". – CommonsWare

+0

Hallo @CommonsWare Es tut mir leid. Ich habe den Projektlink und den onProcessFinish() Tippfehler behoben. Bitte schau es dir an. –

+1

"Ich bekomme einen Fehler muss entweder abstrakt erklärt werden oder abstrakt Methode implementieren" - was abstrakte Methode sagt es, dass Sie implementieren sollten? Oder, wenn Ihre IDE eine Schnellkorrektur unterstützt, um die Methode hinzuzufügen, welche Methode fügt sie hinzu? BTW, dieser Code sollte abstürzen ('mBookArrayAdapter' wird' null'), und es hat keinen Sinn, 'notifyDataSetChanged()' auf einem Adapter aufzurufen, der nicht an eine 'AdapterView' angehängt ist. – CommonsWare

Antwort

2

Wenn ich AsyncResponse implementieren, habe ich processFinish

Ja, das ist genau , was der Fehler Ihnen sagt zu erklären.

aber wenn ich nicht implementieren AsyncResponse Schnittstelle kann ich immer noch alles laufen und es funktioniert.

Dann warum sich überhaupt um den Fehler kümmern?


Wenn Sie das Problem beheben möchten, dann tun die Schnittstelle für die Klasse implementieren und diese stattdessen tun.

public class BookListingActivityFragment extends Fragment 
     implements AsyncResponse { 

    private GoogleBookAsyncTask mGoogleBookAsyncTask; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
      // ....... 

      // Pass "delegate" interface as 'this' 
      mGoogleBookAsyncTask = new GoogleBookAsyncTask(this); 
      mmGoogleBookAsyncTask.execute(); 
     } 

    // This is the interface implementation that is called from the AsyncTask 
    @Override 
    public void processFinish(ArrayList<Book> bookArrayList) { 
     mBookArrayAdapter.clear(); 
     mBookArrayAdapter = new BookAdapter(getContext(), bookArrayList); 
     mBookArrayAdapter.notifyDataSetChanged(); 
    } 

} 
+0

Danke für Ihre Kommentare. Worauf bezieht sich 'this' in' new GoogleBookAsyncTask (this); '? –

+0

Kannst du bitte erklären, warum es nicht so funktionierte, wie es in der SO-Post erklärt wurde? https://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a/12575319#12575319 –

+0

Die "erste" Lösung dort sieht richtig aus. Ich habe die zweite Lösung so bearbeitet, dass sie kompiliert wird. Danke, dass du darauf hingewiesen hast. –

0

Wenn der Fehler ist, was ich denke es ist, sollte es fast genau sagen: anonymous class <your class> is not abstract, and does not implement method <some method> from <some interface>. Wenn dies das ist, was Sie sehen, bedeutet das, dass Sie keine andere abstrakte Methode in dieser Schnittstelle implementieren.

Verwandte Themen