我是android的新手。我在执行GetData时遇到NullPointerException 这是正确的阶级。 我认为问题 - 是错误的网址或获取数据的类型。 JSON文件:http://legs-legs.ru/cat1json.php?json=cat1
使用变量编辑代码
private ListView lv;
private ArrayList<HashMap<String, String>> newslist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
newslist = new ArrayList<>();
lv = (ListView) findViewById(R.id.list_cat1);
new GetData().execute();
}
private class GetData extends AsyncTask<Void, Void, Void> {
...
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String url = "http://legs-legs.ru/cat1json.php?json=cat1";
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
JSONArray contacts = jsonObj.getJSONArray("cat1");
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String title_cat1 = c.getString("title_cat1");
String fulltext_cat1 = c.getString("fulltext_cat1");
// tmp hash map for single contact
HashMap<String, String> news_item = new HashMap<>();
// adding each child node to HashMap key => value
news_item.put("id", id);
news_item.put("title_cat1", title_cat1);
news_item.put("fulltext_cat1", fulltext_cat1);
//contact.put("mobile", mobile);
// adding contact to contact list
newslist.add(news_item);
}
} catch (final JSONException e) {...
}
} else {...
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
ListAdapter adapter = new SimpleAdapter(MainParser.this, newslist,
R.layout.item_cat1, new String[]{ "title_cat1","fulltext_cat1"},
new int[]{R.id.title_cat1, R.id.fulltext_cat1});
lv.setAdapter(adapter);
}
}
Logcat :( stackoverflow不允许我格式化代码中的文本)
12-27 20:18:05.341 8013-8048/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:05.341 8013-8048/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:05.341 8013-8048/? I/FA: To enable faster debug mode event logging run: adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup
12-27 20:18:06.341 8383-8383/? I/FA: App measurement is starting up, version: 9452
12-27 20:18:06.341 8383-8383/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:06.829 8562-8612/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:06.829 8562-8612/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:06.829 8562-8612/? I/FA: To enable faster debug mode event logging run:
adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup
12-27 20:18:08.249 8958-8958/? I/FA: App measurement is starting up, version: 9452
12-27 20:18:08.249 8958-8958/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:08.985 9131-9173/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:08.985 9131-9173/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:08.985 9131-9173/? I/FA: To enable faster debug mode event logging run:
adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup
编辑: 应用程序崩溃开始。
E/MainParser: Response from url: [{"id":"6","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"5","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"любой текст"},{"id":"4","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"3","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"2","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме
D/AndroidRuntime: Shutting down VM
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4d75b20)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.alexsprod.jsonparserproject, PID: 9985
java.lang.NullPointerException
at com.alexsprod.jsonparserproject.MainParser$GetData.onPostExecute(MainParser.java:139)
at com.alexsprod.jsonparserproject.MainParser$GetData.onPostExecute(MainParser.java:68)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:3)
在响应
中获取JSONArray
时,使用下面的代码更改代码
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject c= array.getJSONObject(i);
String id = c.getString("id");
String title_cat1 = c.getString("title_cat1");
String fulltext_cat1 = c.getString("fulltext_cat1");
// tmp hash map for single contact
HashMap<String, String> news_item = new HashMap<>();
// adding each child node to HashMap key => value
news_item.put("id", id);
news_item.put("title_cat1", title_cat1);
news_item.put("fulltext_cat1", fulltext_cat1);
//contact.put("mobile", mobile);
// adding contact to contact list
newslist.add(news_item);
}
UPDTED
像这样改变分类代码。
public class CatOneFragment extends Fragment {
public ListView lv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fr_cat1, container, false);
lv = (ListView) view.findViewById(R.id.list_cat1);
new GetData().execute();
return view;
}
class GetData extends AsyncTask<Void, Void, Void> {
private ArrayList<HashMap<String, String>> newslist = new ArrayList<>();
@Override
protected void onPreExecute() {
super.onPreExecute();
//Toast.makeText("Json Data is downloading", Toast.LENGTH_LONG).show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String url = "http://legs-legs.ru/cat1json.php?json=cat1";
String jsonStr = sh.makeServiceCall(url);
newslist = new ArrayList<>();
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject c = null;
c = array.getJSONObject(i);
String id = c.getString("id");
String title_cat1 = c.getString("title_cat1");
String fulltext_cat1 = c.getString("fulltext_cat1");
// tmp hash map for single contact
HashMap<String, String> news_item = new HashMap<>();
news_item.put("id", id);
news_item.put("title_cat1", title_cat1);
news_item.put("fulltext_cat1", fulltext_cat1);
newslist.add(news_item);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
//CANNOT RESOLVE METHOD
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//CANNOT RESOLVE METHOD
Toast.makeText(getActivity(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
//CANNOT RESOLVE METHOD
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//CANNOT RESOLVE METHOD
Toast.makeText(getActivity(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG).show();
}
});
}
return null;
}
protected void onPostExecute(Void result) {
super.onPostExecute(result);
SimpleAdapter adapter = new SimpleAdapter(getActivity(), newslist,
R.layout.item_cat1, new String[]{"title_cat1", "fulltext_cat1"},
new int[]{R.id.title_cat1, R.id.fulltext_cat1});
//CANNOT RESOLVE SYMBOL
lv.setAdapter(adapter);
}
}
}
答案 1 :(得分:2)
试试这个
1.您的列表项目未定义Content_main_parser.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/flContent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.alexsprod.jsonparserproject.MainParser"
tools:showIn="@layout/app_bar_main_parser">
<ListView
android:id="@+id/list_cat1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/error_connecting"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Json解析错误
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject c= null;
c = array.getJSONObject(i);
String id = c.getString("id");
String title_cat1 = c.getString("title_cat1");
String fulltext_cat1 = c.getString("fulltext_cat1");
// tmp hash map for single contact
HashMap<String, String> news_item = new HashMap<>();
news_item.put("id", id);
news_item.put("title_cat1", title_cat1);
news_item.put("fulltext_cat1", fulltext_cat1);
newslist.add(news_item);
使用volley尝试以下代码:
3.在项目应用程序中添加依赖项 - > gradle
compile 'com.android.volley:volley:1.1.0'
4.主要活动
public class MainParser extends AppCompatActivity {
private ListView lv;
private ArrayList<HashMap<String, String>> newslist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_parser);
newslist = new ArrayList<>();
lv = (ListView) findViewById(R.id.list_cat1);
StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://legs-legs.ru/cat1json.php?json=cat1",
new Response.Listener<String>() {
@Override
public void onResponse(String jsonStr) {
try {
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject c = null;
c = array.getJSONObject(i);
String id = c.getString("id");
String title_cat1 = c.getString("title_cat1");
String fulltext_cat1 = c.getString("fulltext_cat1");
// tmp hash map for single contact
HashMap<String, String> news_item = new HashMap<>();
news_item.put("id", id);
news_item.put("title_cat1", title_cat1);
news_item.put("fulltext_cat1", fulltext_cat1);
newslist.add(news_item);
}
SimpleAdapter adapter = new SimpleAdapter(MainParser.this, newslist,
R.layout.item_cat1, new String[]{"title_cat1", "fulltext_cat1"},
new int[]{R.id.title_cat1, R.id.fulltext_cat1});
lv.setAdapter(adapter);
} catch (final JSONException e) {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("error" + error);
}
});
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(stringRequest);
}
}