【问题标题】:I'm trying to create an onclicklistener that will call a function from another class我正在尝试创建一个 onclicklistener,它将调用另一个类的函数
【发布时间】:2019-06-18 14:21:11
【问题描述】:

然后该函数将使用 API 将 json 对象发送到数据库,但似乎 Volley.newRequestQueue(this);是一个空值。它给了我这个错误:E/AndroidRuntime: FATAL EXCEPTION: main 进程: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);
}

}

【问题讨论】:

    标签: android api post android-volley


    【解决方案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);
        }
    }
    

    【讨论】:

    • 只是一个问题将“super.onCreate(savedInstanceState);”还在工作吗?因为 savedInstanceState 没有声明
    • savedInstanceState 是一组参数,可用于从先前状态恢复活动。它与您当前来自 mQueu 为空的空指针异常无关。上面发布的代码应该可以处理它。
    • 最后,如果我可以声明它,我该如何解析从主要活动到 AddToCart 类的上下文?老实说,我非常感谢你帮助我。
    • 您可以在活动的 onCreate 方法中实例化 AddToCart。它会像 this.mAddToCart = new AddToCart(this);
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2015-06-19
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多