Android 异步任务中出现空指针错误
在处理JSON数据时,我得到一个空指针异常,我已经检查了我得到的JSON是否正确。此外,我想将此数据存储在哈希映射中,并根据需要逐个检索Android 异步任务中出现空指针错误,android,json,exception,android-asynctask,Android,Json,Exception,Android Asynctask,在处理JSON数据时,我得到一个空指针异常,我已经检查了我得到的JSON是否正确。此外,我想将此数据存储在哈希映射中,并根据需要逐个检索 public ProgressDialog pDialognew; static JSONParser jParser = new JSONParser(); ArrayList<HashMap<String, String>> allValueList; class SearchData extends AsyncTask&
public ProgressDialog pDialognew;
static JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> allValueList;
class SearchData extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialognew = new ProgressDialog(Activity.this);
pDialognew.setMessage("Loading. Please wait...");
pDialognew.setIndeterminate(false);
pDialognew.setCancelable(true);
pDialognew.show();
}
@Override
protected String doInBackground(String... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
int success;
try
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("match",pName));
JSONObject json = jParser.makeHttpRequest(GlobalServerLocation.url_pol, "GET", params);
success = json.getInt("success");
if (success == 1)
{
JSONArray productObj = json.getJSONArray("object"); // JSON Array
Log.i("val", productObj.toString()); // Correct JSON
total = productObj.length(); // Correct number of rows
Log.i("Len", String.valueOf(total));
for (int j = 0; j < productObj.length(); j++)
{
JSONObject productnew = productObj.getJSONObject(j);
String LS = productnew.getString(TAG_LS);
String CN = productnew.getString(TAG_CN);
String SN = productnew.getString(TAG_SN);
String PN = productnew.getString(TAG_PN);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_LS, LS);
map.put(TAG_CN, CN);
map.put(TAG_SN, SN);
map.put(TAG_PN, PN);
allValueList.add(map);
}
}
else
{
Log.i("Error", " Some Error from Php Script");
}
}
catch (JSONException e)
{
Log.i("Error", e.toString());
}
}
});
return null;
}
@Override
protected void onPostExecute(String file_url) {
pDialognew.dismiss(); // Line 113
}
}
如果需要代码的任何其他部分,请告诉我。通常,AsyncTask被用作新线程来执行繁重的操作,而不会阻塞主UI线程。但是,您已经在AsyncTask的
doInBackground()
中使用了我下面提到的代码,这将再次使进程在主线程中执行(特别是在更高版本的手机中),阻止它。因此,最好删除以下行并尝试运行它
runOnUiThread(new Runnable() {
@Override
public void run() {
}
};
AsyncTask有几个部分:一个doInBackground方法(实际上在单独的线程上运行)和一个onPostExecute方法(在UI线程上运行)。onPostExecute的目的是发布结果(例如更新视图层次结构或在文本视图中设置文本)这必须在UI线程上完成。它还可以发布进度更新。为了使这一切正常工作,必须在UI线程上创建AsyncTask并调用execute方法
不能从doInBackground中调用UI操作,否则会使应用程序崩溃。首先,将
pDialognew
的声明移动到SearchData
类中
其次,正如Hari所指出的,去掉runOnUiThread
的东西。你的doInBackground()
方法应该是这样的:
protected String doInBackground(String... params) {
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
// ... rest of your code
} catch (JSONException e) {
Log.i("Error", e.toString());
}
return null;
}
app.javapDialognew.disclose()的第113行是代码的哪一部分;//这是第113行,似乎
pDialognew
不是一个对象,是否有其他人在执行postexecute之前访问/删除/销毁它为什么将其标记为php?我很感谢您的回答,但如果您能指出我在上面代码中的错误,我将不胜感激。我所做的只是获取数据并放入哈希映射,然后我做同样的事情已经有相当长的时间了。
protected String doInBackground(String... params) {
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
// ... rest of your code
} catch (JSONException e) {
Log.i("Error", e.toString());
}
return null;
}
if (pDialognew != null) pDialognew.dismiss();