尝试使用 JSON 填充 Spinner 并在空对象引用上获取 'java.lang.Object[] java.util.Collection.toArray()'
Trying to Populate Spinner with JSON and getting 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
我是一名 android 新手,正在尝试使用 JSON 填充微调器,但我一直收到空指针异常 -
java.lang.NullPointerException: Attempt to invoke interface method
java.lang.Object[] java.util.Collection.toArray()' on a null object
reference
我知道这是一个常见问题,并已查看其他答案和解决方案。我已尝试初始化列表,但仍然无法修复 error.I 认为我无法理解确切需要初始化的位置。
我的完整日志:
07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/Result is: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/res =: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.357 11199-11337/com.genx.meghna.makdver4 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: com.genx.meghna.makdver4, PID: 11199
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
at java.util.ArrayList.addAll(ArrayList.java:188)
at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:173)
at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:117)
at android.os.AsyncTask.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
我的代码:
package com.genx.meghna.makdver4.Fragments;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.genx.meghna.makdver4.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import static com.genx.meghna.makdver4.Fragments.LoginFragment.un;
public class SendCarFragment extends Fragment {
TextView tv1, tv2, tv3;
Spinner sp;
RadioGroup rg;
RadioButton rb1, rb2;
Button btn;
FragmentManager fm;
ArrayList<String> carList;
ArrayAdapter<String> adapter;
String res;
SharedPreferences spp;
public SendCarFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_send_car, container, false);
btn = rootView.findViewById(R.id.nextPage1);
rg = rootView.findViewById(R.id.radioGroup1);
rb1 = rootView.findViewById(R.id.rb1);
rb2 = rootView.findViewById(R.id.rb2);
sp = rootView.findViewById(R.id.spinnerSelectCar);
spp=getContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (rg.getCheckedRadioButtonId() == -1) {
Toast.makeText(getContext(), "Select One Option", Toast.LENGTH_SHORT).show();
} else {
if (rb1.isChecked()) {
fm = getFragmentManager();
fm.beginTransaction().replace(R.id.container, new ServiceCenterListFragment(), "Service center").commit();
} else {
fm = getFragmentManager();
fm.beginTransaction().replace(R.id.container, new SelectionFragment(), "Select Address").commit();
}
}
}
});
return rootView;
}
public void onStart(){
super.onStart();
String username1 = spp.getString(un, "userKey");
GetData get = new GetData();
get.execute(username1);
}
class GetData extends AsyncTask<String, Void, String> {
List<String> list;
protected void onPreExecute(){
super.onPreExecute();
list=new ArrayList<>();
}
@Override
protected String doInBackground(String... params) {
{
try {
String username1 = params[0];
String link = "http://10.0.3.2//Traccar/getCars.php";
String myurl = "username=" + username1;
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.getOutputStream().write(myurl.getBytes());
int response = connection.getResponseCode();
Log.d("Response code", "" + response);
if (response == HttpURLConnection.HTTP_OK) {
String line;
InputStreamReader isr = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(isr);
StringBuilder buffer = new StringBuilder();
while ((line = br.readLine()) != null) {
buffer.append(line);
//res+=line;
}
Log.d("Result is", buffer.toString());
res = buffer.toString();
Log.d("res = ", res);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
try{
JSONArray jrr = new JSONArray(res);
for (int i=0; i<jrr.length(); i++) {
JSONObject obj = jrr.getJSONObject(i);
String name = obj.getString("car_number");
list.add(name);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
return res;
}
protected void onPostExecute(String res) {
list.addAll(carList);
adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, carList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
}
我尝试的另一种方法是将我的 JSON 解析代码放在 onPostExecute()
函数中,但我一直无法尝试将我的数组从 doInBackground()
传递到 onPostExecute()
这导致我的 onPostExecute()
从未被使用过。
如有任何帮助,我们将不胜感激。谢谢!
你有一个 carList
和一个 list
。您不初始化或添加项目到 carList
,而是尝试将其传递给 list.addAll(carList);
,这自然无法工作。
由于数据已经在 list
中,您应该可以这样做
class GetData extends AsyncTask<String, Void, List<String>> {
List<String> list;
protected void onPreExecute(){
super.onPreExecute();
list=new ArrayList<>();
}
@Override
protected String doInBackground(String... params) {
{
try {
String username1 = params[0];
String link = "http://10.0.3.2//Traccar/getCars.php";
String myurl = "username=" + username1;
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.getOutputStream().write(myurl.getBytes());
int response = connection.getResponseCode();
Log.d("Response code", "" + response);
if (response == HttpURLConnection.HTTP_OK) {
String line;
InputStreamReader isr = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(isr);
StringBuilder buffer = new StringBuilder();
while ((line = br.readLine()) != null) {
buffer.append(line);
//res+=line;
}
Log.d("Result is", buffer.toString());
res = buffer.toString();
Log.d("res = ", res);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
try{
JSONArray jrr = new JSONArray(res);
for (int i=0; i<jrr.length(); i++) {
JSONObject obj = jrr.getJSONObject(i);
String name = obj.getString("car_number");
list.add(name);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
return list;
}
protected void onPostExecute(List<String> res) {
adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, res);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
请注意,我将 AsyncTask 更改为 AsyncTask<String, Void, List<String>>
,不需要 carList
。
我是一名 android 新手,正在尝试使用 JSON 填充微调器,但我一直收到空指针异常 -
java.lang.NullPointerException: Attempt to invoke interface method
java.lang.Object[] java.util.Collection.toArray()' on a null object
reference
我知道这是一个常见问题,并已查看其他答案和解决方案。我已尝试初始化列表,但仍然无法修复 error.I 认为我无法理解确切需要初始化的位置。
我的完整日志:
07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/Result is: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/res =: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.357 11199-11337/com.genx.meghna.makdver4 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: com.genx.meghna.makdver4, PID: 11199
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
at java.util.ArrayList.addAll(ArrayList.java:188)
at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:173)
at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:117)
at android.os.AsyncTask.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
我的代码:
package com.genx.meghna.makdver4.Fragments;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.genx.meghna.makdver4.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import static com.genx.meghna.makdver4.Fragments.LoginFragment.un;
public class SendCarFragment extends Fragment {
TextView tv1, tv2, tv3;
Spinner sp;
RadioGroup rg;
RadioButton rb1, rb2;
Button btn;
FragmentManager fm;
ArrayList<String> carList;
ArrayAdapter<String> adapter;
String res;
SharedPreferences spp;
public SendCarFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_send_car, container, false);
btn = rootView.findViewById(R.id.nextPage1);
rg = rootView.findViewById(R.id.radioGroup1);
rb1 = rootView.findViewById(R.id.rb1);
rb2 = rootView.findViewById(R.id.rb2);
sp = rootView.findViewById(R.id.spinnerSelectCar);
spp=getContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (rg.getCheckedRadioButtonId() == -1) {
Toast.makeText(getContext(), "Select One Option", Toast.LENGTH_SHORT).show();
} else {
if (rb1.isChecked()) {
fm = getFragmentManager();
fm.beginTransaction().replace(R.id.container, new ServiceCenterListFragment(), "Service center").commit();
} else {
fm = getFragmentManager();
fm.beginTransaction().replace(R.id.container, new SelectionFragment(), "Select Address").commit();
}
}
}
});
return rootView;
}
public void onStart(){
super.onStart();
String username1 = spp.getString(un, "userKey");
GetData get = new GetData();
get.execute(username1);
}
class GetData extends AsyncTask<String, Void, String> {
List<String> list;
protected void onPreExecute(){
super.onPreExecute();
list=new ArrayList<>();
}
@Override
protected String doInBackground(String... params) {
{
try {
String username1 = params[0];
String link = "http://10.0.3.2//Traccar/getCars.php";
String myurl = "username=" + username1;
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.getOutputStream().write(myurl.getBytes());
int response = connection.getResponseCode();
Log.d("Response code", "" + response);
if (response == HttpURLConnection.HTTP_OK) {
String line;
InputStreamReader isr = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(isr);
StringBuilder buffer = new StringBuilder();
while ((line = br.readLine()) != null) {
buffer.append(line);
//res+=line;
}
Log.d("Result is", buffer.toString());
res = buffer.toString();
Log.d("res = ", res);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
try{
JSONArray jrr = new JSONArray(res);
for (int i=0; i<jrr.length(); i++) {
JSONObject obj = jrr.getJSONObject(i);
String name = obj.getString("car_number");
list.add(name);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
return res;
}
protected void onPostExecute(String res) {
list.addAll(carList);
adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, carList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
}
我尝试的另一种方法是将我的 JSON 解析代码放在 onPostExecute()
函数中,但我一直无法尝试将我的数组从 doInBackground()
传递到 onPostExecute()
这导致我的 onPostExecute()
从未被使用过。
如有任何帮助,我们将不胜感激。谢谢!
你有一个 carList
和一个 list
。您不初始化或添加项目到 carList
,而是尝试将其传递给 list.addAll(carList);
,这自然无法工作。
由于数据已经在 list
中,您应该可以这样做
class GetData extends AsyncTask<String, Void, List<String>> {
List<String> list;
protected void onPreExecute(){
super.onPreExecute();
list=new ArrayList<>();
}
@Override
protected String doInBackground(String... params) {
{
try {
String username1 = params[0];
String link = "http://10.0.3.2//Traccar/getCars.php";
String myurl = "username=" + username1;
URL url = new URL(link);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.getOutputStream().write(myurl.getBytes());
int response = connection.getResponseCode();
Log.d("Response code", "" + response);
if (response == HttpURLConnection.HTTP_OK) {
String line;
InputStreamReader isr = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(isr);
StringBuilder buffer = new StringBuilder();
while ((line = br.readLine()) != null) {
buffer.append(line);
//res+=line;
}
Log.d("Result is", buffer.toString());
res = buffer.toString();
Log.d("res = ", res);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
try{
JSONArray jrr = new JSONArray(res);
for (int i=0; i<jrr.length(); i++) {
JSONObject obj = jrr.getJSONObject(i);
String name = obj.getString("car_number");
list.add(name);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
return list;
}
protected void onPostExecute(List<String> res) {
adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, res);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
请注意,我将 AsyncTask 更改为 AsyncTask<String, Void, List<String>>
,不需要 carList
。