我正在尝试通过Volley运行一个简单的HTTP查询,这个代码在onCreate()下的默认Android 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);
当我在一个单独的类中运行此代码时,最后一行会出错。
Volley.newRequestQueue(this).add(jsonRequest);
newRequestQueue
上的错误是“无法解析符号'newRequestQueue',而add(jsonRequest);
上的错误是”缺少方法正文,或声明抽象。“
任何帮助都会受到赞赏,不知道为什么它在Activity中有效,但在类文件中却没有...我假设原因是onCreate(),但我确信有一些方法可以将它保存在另一个类?
答案 0 :(得分:4)
这是因为在线:
Volley.newRequestQueue(this).add(jsonRequest);
您传入this
的{{1}}需要是Android上下文。当您从Activity中调用它时,newRequestQueue()
会引用Activity,它是一种Context。当你从自己的班级打电话时,它会引用那个不会成为语境的班级。
您有几种不同的选择:
添加上下文作为对象的构造函数参数
你可以拥有它,这样当你创建一个类的实例时,你必须传入你所持有的上下文。这将在你打电话给Volley时使用:
this
然后,当您从Activity创建课程时,您必须将其实例化为:
public class MyClass {
private Context context;
public MyClass(Context context) {
this.context = context;
}
public void doVolleyRequest() {
//...
Volley.newRequestQueue(context).add(jsonRequest);
}
}
拥有对应用程序上下文的静态引用
您可以拥有可以从Application类访问的Application Context的静态引用。要在Application Class中执行此操作,请执行以下操作:
MyClass myClass = new MyClass(this);
然后从您使用Volley的班级开始:
public class App extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
拥有App Wide RequestQueue
相反,您可以在Application类中设置请求队列,并将所有请求添加到:
Volley.newRequestQueue(App.getContext()).add(jsonRequest);
然后在你的课堂上:
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;
}
}