我正在尝试创建一个onclicklistener,它将从另一个类中调用一个函数

时间:2019-01-24 18:55:51

标签: android api post android-volley

该函数随后将使用API​​将json对象发送到数据库中,但似乎Volley.newRequestQueue(this);为空值。它给我这个错误:E / AndroidRuntime:致命异常:主要     流程:com.example.kevin.barcodescanner,PID:11301     java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'com.android.volley.Request com.android.volley.RequestQueue.add(com.android.volley.Request)'         在com.example.kevin.barcodescanner.AddToCart.jsonParse(AddToCart.java:59)         在com.example.kevin.barcodescanner.MainActivity $ 2.onClick(MainActivity.java:49)         在android.view.View.performClick(View.java:6597)         在android.view.View.performClickInternal(View.java:6574)         在android.view.View.access $ 3100(View.java:778)         在android.view.View $ PerformClick.run(View.java:25885)         在android.os.Handler.handleCallback(Handler.java:873)         在android.os.Handler.dispatchMessage(Handler.java:99)         在android.os.Looper.loop(Looper.java:193)         在android.app.ActivityThread.main(ActivityThread.java:6669)         在java.lang.reflect.Method.invoke(本机方法)         在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

公共类MainActivity扩展了AppCompatActivity {

public static TextView resultTextView;
Button scan_btn, add_btn;

AddToCart add = new AddToCart();


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


    resultTextView = (TextView)findViewById(R.id.result_text);
    scan_btn = (Button)findViewById(R.id.btn_scan);
    add_btn =(Button)findViewById(R.id.add_btn);



    scan_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(getApplicationContext(), ScanCodeActivity.class));
        }
    });

    add_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            add.jsonParse();
        }
    });
}

}

公共类AddToCart扩展了AppCompatActivity {

private RequestQueue mQueue;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mQueue = Volley.newRequestQueue(this);
}

public void jsonParse() {

    JSONObject json = new JSONObject();
    try {

        json.put("id","11111111111");
        json.put("name","222222222222");
        json.put("price","1");

    } catch (Exception e) {
        e.printStackTrace();
    }


    String url = "https://fg3qzgb2va.asdasdasdasdas-api.ap-southeast-1.amazonaws.com/sample";
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, json,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    System.out.print("String Response : "+ response.toString());
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    jsonObjectRequest.setTag("VACTIVITY");
    mQueue.add(jsonObjectRequest);
}

}

1 个答案:

答案 0 :(得分:1)

事情是,由于AddToCart并不是真正的活动,因此从未真正调用过oncreate方法,因为没有要显示的内容。   更好的解决方案是通过构造函数将MainActivity的上下文解析为AddToCart并在构造函数中实例化队列

public class AddToCart  {
private RequestQueue mQueue;
   public AddToCart(Context context) {
        super.onCreate(savedInstanceState);
        mQueue = Volley.newRequestQueue(context);
    }

    public void jsonParse() {

        JSONObject json = new JSONObject();
        try {

            json.put("id","11111111111");
            json.put("name","222222222222");
            json.put("price","1");

        } catch (Exception e) {
            e.printStackTrace();
        }


        String url = "https://fg3qzgb2va.asdasdasdasdas-api.ap-southeast-1.amazonaws.com/sample";
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, json,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        System.out.print("String Response : "+ response.toString());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });
        jsonObjectRequest.setTag("VACTIVITY");
        mQueue.add(jsonObjectRequest);
    }
}