2016-06-12 16 views
0

Ich versuche, eine einfache HTTP-Abfrage durch Volley und dieser Code funktioniert völlig in Ordnung in der Standard-Android MainActivity unter onCreate() auszuführen:Volley Beispiel Fehler nicht in MainActivity

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, (String)null, new Response.Listener<JSONObject>() 
{ 
    @Override 
    public void onResponse(JSONObject response) { 
     // the response is already constructed as a JSONObject! 
     try { 
      //     response = response.getJSONObject("results"); 
      String success = response.getString("success"), 
        status = response.getString("status"); 

      if(status.equals("1")) 
      { 
       GlobalVar.armedStatus = 1; 
      } 
      else if(status.equals("0")) 
      { 
       GlobalVar.armedStatus = 0; 
      } 

      System.out.println("Success: "+success+"\nStatus: "+status); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


    } 
}, new Response.ErrorListener() { 

    @Override 
    public void onErrorResponse(VolleyError error) { 
     error.printStackTrace(); 
    } 
}); 
// RequestQueue queue = Volley.newRequestQueue(jsonRequest); 
    Volley.newRequestQueue(this).add(jsonRequest); 

Wenn ich diesen Code ausführen in eine separate Klasse, aber die letzte Zeile gibt einen Fehler.

Volley.newRequestQueue(this).add(jsonRequest); 

Der Fehler auf newRequestQueue ist „Symbol‚newRequestQueue‘kann nicht aufgelöst werden und die Fehler auf add(jsonRequest); wird‚Methode Körper fehlt oder abstrakt erklären.‘

Jede Hilfe würde geschätzt, nicht sicher, warum es funktioniert in der Aktivität, aber nicht in der Klassendatei ... gehe ich davon aus, der Grund ist onCreate(), aber ich bin sicher, dass einiger Weg dorthin ist es in einer anderen Klasse zu halten

Antwort

4

es ist, weil in der Linie:

Volley.newRequestQueue(this).add(jsonRequest); 

Die this übergeben Sie in newRequestQueue() muss ein Android-Kontext sein. Wenn Sie es über Ihre Aktivität aufrufen, bezieht sich this auf die Aktivität, die eine Art von Kontext ist. Wenn du rufst, wenn es von deiner eigenen Klasse stammt, wird es sich auf die Klasse beziehen, die kein Kontext sein wird.

Sie haben ein paar verschiedene Möglichkeiten:

Add Context als Constructor Parameter für Ihr Objekt

Man kann es so, dass, wenn Sie eine Instanz der Klasse machen Sie in einem Pass haben Kontext, an dem Sie festhalten. Dies würde dann verwendet werden, wenn Sie Volley nennen:

public class MyClass { 

    private Context context; 

    public MyClass(Context context) { 
     this.context = context; 
    } 

    public void doVolleyRequest() { 

     //... 
     Volley.newRequestQueue(context).add(jsonRequest); 
    } 

} 

Dann, wenn Sie Ihre Klasse von Ihrer Aktivität machen würden Sie instanziieren müssen es mögen:

MyClass myClass = new MyClass(this); 

Haben Sie einen statischen Verweis auf den Anwendungskontext

Sie können einen statischen Verweis auf den Anwendungskontext haben, auf den über Ihre Anwendungsklasse zugegriffen werden kann. Um dies zu tun in Ihrer Anwendungsklasse hat so etwas wie:

public class App extends Application { 

    private static Context context; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
    } 

    public static Context getContext() { 
     return context; 
    } 
} 

Dann aus der Klasse, wo Sie Volley verwenden:

Volley.newRequestQueue(App.getContext()).add(jsonRequest); 

haben einen App Breiten Request

Stattdessen könnten Sie setzen eine Anforderungswarteschlange in Ihrer Anwendungsklasse und fügen Sie alle Anforderungen dazu hinzu:

public class App extends Application { 

    private static RequestQueue requestQueue; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     requestQueue = Volley.newRequestQueue(getApplicationContext()); 
    } 

    public static RequestQueue getRequestQueue() { 
     return requestQueue; 
    } 
} 

Dann in Ihrer Klasse:

App.getRequestQueue().add(jsonRequest);