我正在尝试创建一个 onclicklistener,它将调用另一个 class 的函数
I'm trying to create an onclicklistener that will call a function from another class
该函数然后将使用 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.performClick 内部(View.java:6574)
android.view.View.access3100 美元(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)
public class 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();
}
});
}
}
public class 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);
}
}
问题在于,由于 AddToCart 并非真正的 activity,因此从未真正调用过 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);
}
}
该函数然后将使用 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.performClick 内部(View.java:6574) android.view.View.access3100 美元(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)
public class 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();
}
});
}
}
public class 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);
}
}
问题在于,由于 AddToCart 并非真正的 activity,因此从未真正调用过 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);
}
}