Volley示例错误不在MainActivity中

时间:2016-06-12 19:41:27

标签: java android android-volley

我正在尝试通过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(),但我确信有一些方法可以将它保存在另一个类?

1 个答案:

答案 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;
    }
}