2016-07-27 9 views
-1

Hallo erst einmal, ich suchte einige ähnliche Fragen wie bei mir, aber leider konnte ich nicht die Ähnlichkeit von meinem Code, um sie zu finden, so bitte hier an michAndroid Retrofit „Versuch, virtuelle Methode auf ein Null-Objekt Verweis aufrufen“

I

eine Hauptaktivität der Klasse haben
public class MainActivity extends AppCompatActivity { 

public ProgressDialog loading; 
public String[] itemer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    RetrofitHandler handler = new RetrofitHandler(); 
    handler.getContacts(MainActivity.this); 
} 

public void getter(String[] response, int size) { 
    String[] itemer; 
    itemer = new String[size]; 
    if (response != null) { 
     itemer = response; 
     Toast.makeText(MainActivity.this, itemer[0], Toast.LENGTH_SHORT).show(); 
    } 
} 

Und ein Handler für mein Ergebnis

public class RetrofitHandler { 
public String[] item; 
public static final String ROOT_URL = "http://api.androidhive.info"; 
public List<Contacts> contacts; 

// final MainActivity main = new MainActivity(); 
public void getContacts(final Context context) { 
    final ProgressDialog loading = ProgressDialog.show(context, "Fetching Data", "Please wait...", false, false); 

    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build(); 
    ContactsAPI api = adapter.create(ContactsAPI.class); 

    api.getContacts(new Callback<Contacts>() { 
     @Override 
     public void success(Contacts contacts, Response response) { 
      loading.dismiss(); 
      MainActivity update = new MainActivity(); 
      List<Contact> contactList = contacts.getContacts(); 

      item = new String[contactList.size()]; 
      int size = contactList.size(); 
      for (int i = 0; i < contactList.size(); i++) { 
       item[i] = contactList.get(i).getName(); 
      } 
      update.getter(item, size); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      Toast.makeText(context, "Error Occured", Toast.LENGTH_LONG).show(); 
     } 
    }); 


} 

Aber ich einen Fehler auf meine Antwort in der Haupttätigkeit bekommen hier ist mein log

   java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                     at android.content.ContextWrapper.getResources(ContextWrapper.java:87) 
                     at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81) 
                     at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:542) 
                     at android.widget.Toast.<init>(Toast.java:102) 
                     at android.widget.Toast.makeText(Toast.java:259) 
                     at com.exist.kelvs.retrofit2.MainActivity.getter(MainActivity.java:55) 
                     at com.exist.kelvs.retrofit2.RetrofitHandler$1.success(RetrofitHandler.java:41) 
                     at com.exist.kelvs.retrofit2.RetrofitHandler$1.success(RetrofitHandler.java:28) 
                     at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

ich maked sicher, dass der Handler Punkt, wo nicht null es mit Toast getestet, aber wenn ich es passieren Getter es mir den Fehler gibt, wo ich falsch gemacht? :(

+0

Was ist Zeile Nr.55 in Ihrer MainActivity? – SripadRaj

+0

Mögliches Duplikat von [Was ist eine NullPointerException und wie behebe ich sie?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Sufian

Antwort

0

versuchen, den Toast in Ihrer Haupttätigkeit zu löschen oder Mainactivity.this zu getApplicationContext() ersetzen

aus. Toast.makeText (MainActivity.this, itemer [0], Toast.LENGTH_SHORT). Zeigen();

zu:

Toast.makeText(getApplicationContext(), itemer[0], Toast.LENGTH_SHORT).show(); 
+0

Tryed Ihre Lösung, wenn ich den Toast löschen, läuft es gut, aber wenn ich versuchte, getApplicationContext() der Fehler ist immer noch der gleiche :( – user3262438

+0

Ich denke, dass Ihr Array Iterer leer ist. Sie erklären Iter 2 Mal in der Klasse und in Die Getter-Funktion überprüft es möglicherweise, dass die Emty-Wert Ihres Arrays. –

1
MainActivity update = new MainActivity(); 

Niemals Aktivitäten mit new instanziieren. Sie sind nicht initialisiert, um nützlich zu sein.

Stattdessen können Sie Ihre Aktivität als Referenz übergeben, wo erforderlich. Ändern

public void getContacts(final Context context) 

zu z.B.

public void getContacts(final MainActivity mainActivity) 

und mainActivity verwenden, wo Sie eine Aktivität benötigen Context (wie mit Dialog s) und wenn Sie eine Methode auf MainActivity aufrufen müssen.

Beachten Sie, dass das Übergeben von Aktivitätsreferenzen auf asynchrone Vorgänge zu erheblichen Speicherlecks führen kann und Sie den Aktivitätslebenszyklus berücksichtigen müssen - die Aktivität ist möglicherweise nicht aktiv, wenn der asynchrone Vorgang abgeschlossen ist.

+0

Vielen Dank, dass funktioniert sehr gut. Aber eine letzte Sache, was, wenn ich meine Handler mit einer anderen Klasse anrufen muss, welchen Ansatz sollte ich verwenden? – user3262438

+0

@ laalto http : //stackoverflow.com/questions/39219078/error-with-progress-dialog kannst du mir bitte weiterhelfen .. ich stecke auf dieses Problem nur auf Marshmallow – Asmi