2015-01-01 22 views
8

Ho trovato un mini lettore Deezer su github, ma penso che sia stato codificato in Eclipse. Io comunque lavoro in Android Studio.La classe deve essere dichiarata astratta o implementare il metodo astratto

Beeing la mia prima applicazione Android deve essere una domanda niubbo, ma io sono bloccato su questo:

private DialogListener mDeezerDialogListener = new **DialogListener**() { 

      @Override 
      public void onComplete(Bundle values) { 
       // store the current authentication info 
       SessionStore sessionStore = new SessionStore(); 
       sessionStore.save(mDeezerConnect, LoginActivity.this); 

       // Launch the Home activity 
       Intent intent = new Intent(LoginActivity.this, HomeActivity.class); 
       startActivity(intent); 
      } 

      @Override 
      public void onDeezerError(final DeezerError deezerError) { 
       Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, 
         Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onError(final DialogError dialogError) { 
       Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, 
         Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onCancel() { 
       Toast.makeText(LoginActivity.this, R.string.login_cancelled, Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onOAuthException(OAuthException oAuthException) { 
       Toast.makeText(LoginActivity.this, R.string.invalid_credentials, Toast.LENGTH_LONG) 
         .show(); 
      } 
     };` 

La funzione grassetto mi sta dando un errore che recita:

Class 'Anonymous class derived from DialogListener' must either be declared abstract or implement abstract method 'onException(Exception)' in 'DialogListener'.

Non ho idea di quale sia il problema, ma per aggiungere la beffa al danno, tutto va bene con il primo @Override, ma il secondo, il terzo e l'ultimo mi danno questo errore:

Error:(91, 17) error: method does not override or implement a method from a supertype

Questo dovrebbe essere uno snippet di codice funzionante, quindi qual è il problema qui, perché i reclami su alcune delle @Overrides?

Questi due errori sono collegati?

Edit1:

Come suggerito ho aggiunto un'altra funzione:

@Override 
      public void onException(Exception exception) { 

      } 

e il primo errore è andato via. Potrebbe essere che il codice originale su github sia stato scritto per una versione precedente di SDK, che facesse roba diferente?

@Override errori rimasti. ma per quanto posso vedere, queste sono sotto-eccezioni di onException?

EDIT2:

questo è definito nella Deezer SDK:

import com.deezer.sdk.network.connect.event.DialogListener; 

sto guardando la loro documentazione e si parla in "Metodo Sommario": onCancel(), onComplete(Bundle values), onException(Exception exception).

Inoltre, dice: void onException(Exception exception) viene chiamato quando viene generata un'eccezione durante il processo di autenticazione.

le seguenti eccezioni possono essere sollevate: OAuthException, DeezerError, DialogError.

Penso che posterò tutti i dati aggiuntivi qui.

Edit3:

Ecco come ho riscritto il codice:

@Override 
    public void onException(Exception exception) { 

     if(exception instanceof DeezerError){ 
      Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, 
        Toast.LENGTH_LONG).show(); 
     } 
     else if(exception instanceof DialogError){ 
      Toast.makeText(LoginActivity.this, R.string.deezer_error_during_login, 
        Toast.LENGTH_LONG).show();  
     } 
     else if(exception instanceof OAuthException){ 
      Toast.makeText(LoginActivity.this, R.string.invalid_credentials, Toast.LENGTH_LONG) 
        .show();  
     } 
     else{ 
      //not implemented? 
     } 

    } 

dà un avvertimento: Condition 'exception instanceof OAuthException' is always 'false'.

Dovrò lavorare su questo, ma questa è ora una domanda diversa.

+0

Puoi mostrarci la definizione della classe DialogListener (o interfaccia)? E sì, i 2 errori sembrano collegati. – Thierry

+0

Questo è definito in Deezer SDK: import com.deezer.sdk.network.connect.event.DialogListener; Sto osservando la loro documentazione e menziona sotto "Riepilogo dei metodi": onCancel(), onComplete (valori bundle), onException (Eccezione eccezione). Dice anche: void onException (Eccezione eccezione) viene chiamato quando viene generata un'eccezione durante il processo di autenticazione. Possono essere generate le seguenti eccezioni: OAuthException, DeezerError, DialogError. Penso che mi manchi qualcosa con l'editor ?? – iggy

+0

@iggy Ho aggiornato la mia risposta. – Thierry

risposta

6

Come accennato nel commento, il Deezer doc dice che DialogListener ha 3 metodi: onCancel(), onComplete (valori bundle), onException (Eccezione eccezione).

Quindi è necessario implementare SOLO queste 3 funzioni.

 @Override 
     public void onComplete(Bundle values) { 
      // store the current authentication info 
      SessionStore sessionStore = new SessionStore(); 
      sessionStore.save(mDeezerConnect, LoginActivity.this); 

      // Launch the Home activity 
      Intent intent = new Intent(LoginActivity.this, HomeActivity.class); 
      startActivity(intent); 
     } 


     @Override 
     public void onCancel() { 
      Toast.makeText(LoginActivity.this, R.string.login_cancelled, Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onException(Exception e) { 
      // ... 
     } 

e rimuovere gli altri metodi: onError, ecc Forse esempio, come lei suggerisce, è per un'altra versione del SDK.

Nota: non utilizzo Android Studio, ma in Eclipse si ha un comando per creare automaticamente i metodi necessari (vuoto, con menzione 'TODO'). Forse lo stesso esiste in Android Studio?

+0

Non saprei, ho programmato in Android Studio per 6 ore. Google lo farà ... grazie! – iggy

+0

@ggie spero che possa essere d'aiuto. Si prega di accettare la risposta se aiuta. – Thierry

+0

Entrambi avete trovato la stessa soluzione a ca. lo stesso tempo. Come posso accreditarvi entrambi? – iggy

2

Quando si implementano classi o interfacce astratte anonime in Java, è necessario fornire l'implementazione per tutti i metodi astratti (in caso di classe astratta) o tutti i metodi dichiarati nell'interfaccia.

Errore si sta notificando che non è stato implementato il metodo onException dichiarato in DialogListener.

Altri errori sono molto probabilmente collegati al primo, ma anche questo non deve essere il caso. Solitamente, l'errore singolo che si esegue può innescare diversi errori del compilatore e in tal caso, quando si cancella il primo, viene cancellato anche l'altro. Quando ricevi errori del compilatore, devi sempre concentrarti sulla cancellazione del primo perché altri potrebbero essere errori falsi e non problemi reali.

"method does not override or implement a method from a supertype" può anche significare che la firma dei metodi dichiarati non corrisponde alle firme in classe astratta e in tal caso @Override non è accettato dal compilatore.

+0

Grazie, non ancora lì, ma andando avanti. Vedi post originale. – iggy

+0

Penso che la tua ultima modifica si avvicini al mio problema ... grazie! – iggy

Problemi correlati