我正在尝试使用JSON从我的服务器获取数据并将检索到的数据放入数组 这是检索类别,intitule,id_news,图像
的功能public void getNewsFromServer(int beg){
InputStream is = null;
String result = "";
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("beg", Integer.toString(beg)));
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(strURL);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
}
// conversion of the query into string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is,
"iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Toast.makeText(context, e.toString(),Toast.LENGTH_LONG).show();
}
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
id_news[i] = Integer.toString(json_data.getInt("id_news"));
categorie[i] = json_data.getString("categorie");
intitule[i] = json_data.getString("intitule");
image[i] = json_data.getString("image");
}
}catch (Exception e){
Toast.makeText(context, e.toString(),
Toast.LENGTH_LONG).show();
}
}
这是 MainActivity.java
String [] id_news= new String [20];
String [] categorie= new String [20];
String [] intitule= new String [20];
String [] image= new String [20];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
try{
//get data from the server and put it in tables
getNewsFromServer(beg);
}catch(NullPointerException e)
{
Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
e.getStackTrace();
}
}
但我总是得到NULLPointerException 请帮忙
这些logCat跟踪
这是上下文的初始化 Context context = this;
但它会产生另一个异常 NetworkOnMainThreadException 和 NullPointerException 和 JSONException:字符0的输入结束 ..
答案 0 :(得分:2)
NPE来自Toast
初始化。确保您传递的context
不为空。
由于您在异常catch块中使用toast,因此请使用以下方法记录异常堆栈跟踪: e.printStackTrace()
要抓住根本原因。 (主要嫌疑人:NetworkOnMainThreadException
)
对于NetworkOnMainThreadException
,您的网络是否在后台线程上运行。有关详情,请参阅How to fix android.os.NetworkOnMainThreadException?。
答案 1 :(得分:0)
在您对Toast的调用中,context
变量很可能为空。
从不捕获NullPointerException。确保它永远不会被抛出。
答案 2 :(得分:0)
正如laalto所指出的,NPE
正在Toast
声明中。
您能否提供有关如何初始化上下文的代码段。
还尝试使用getActivity()
一次,看看它是否解决了这个问题。
如果确实如此,则override onAttach()
并初始化其中的context
。直接给予getActivity()
不是一个好习惯。
NetworkOnMainThreadException
是因为您应该在单独的线程上进行网络调用
使用类似的东西:
Thread thread = new Thread()
{
@Override
public void run() {
try {
//your network calls here
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
答案 3 :(得分:0)
我通过使用AsyncTask
解决了这个问题private class Asyn_GetNewsFromServer extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
getNewsFromServer(beg);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//do what ever you want
}
}
thx求助