Android AsyncTask OnPostExecute中的NullPointerException
我是android新手。我在执行正确的onPostExecute时得到了Android AsyncTask OnPostExecute中的NullPointerException,android,Android,我是android新手。我在执行正确的onPostExecute时得到了data=null。现在我只想显示一个没有可用数据的对话框。但是我得到了NullPointerException public class GetPreviousChatNewThread extends AsyncTask<Void,Void,Void> { ProgressDialog dialog; ArrayList<HashMap<Strin
data=null
。现在我只想显示一个没有可用数据的对话框。但是我得到了NullPointerException
public class GetPreviousChatNewThread extends AsyncTask<Void,Void,Void> {
ProgressDialog dialog;
ArrayList<HashMap<String,String>> data;
@Override
protected Void doInBackground(Void... void1) {
data=new ArrayList<HashMap<String,String>>();
data=HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
"ReturnUserAdminChats",
"admin",
"You" ,
"a",
clientEmail,
UserAdminChatActivity.LastShowingChatDate));
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(!data.isEmpty()) // <-- error here
{
adapter.InsertValuesAtTop(data);
}
else
{
Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
}
if(dialog.isShowing())
dialog.dismiss();
}
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
}
}
编辑:
以下是HandleJson的代码:
public class HandleJSON {
private static ArrayList<HashMap<String,String>> chat;
static final String Key_username="username_key";
static final String Key_email="email_key";
static final String Key_messageText="messageText_key";
static final String Key_messageDate="messageDate_key";
static final String Key_messageCounts="messageCount_key";
static boolean newObject;
public static ArrayList<HashMap<String,String>> ParseJsonForLatestChats(String jsonData)
{
try {
if(HandleJSON.newObject)
{
chat=new ArrayList<HashMap<String,String>>();
}
Log.i("jsonReturned",jsonData.toString());
JSONArray jsonarr=new JSONArray(jsonData);
for(int i=0;i<jsonarr.length();i++)
{
HashMap<String,String> hashMap=new HashMap<String,String>();
hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username"));
hashMap.put(HandleJSON.Key_email, jsonarr.getJSONObject(i).getString("email"));
hashMap.put(HandleJSON.Key_messageCounts, jsonarr.getJSONObject(i).getString("count"));
chat.add(hashMap);
}
return chat;
}
catch(JSONException e)
{
Log.e("JsonDek", e.getMessage());
return null;
}
}
public static ArrayList<HashMap<String,String>> ParseJsonForUserAdminChats(String jsonData)
{
chat=new ArrayList<HashMap<String,String>>();
try {
JSONArray jsonarr=new JSONArray(jsonData);
Log.i("GoTo Json",jsonData);
UserAdminChatActivity.LastShowingChatDate=jsonarr.getJSONObject(0).getString("chatDate");
for(int i=jsonarr.length()-1;i>=0;i--)
{
HashMap<String,String> hashMap=new HashMap<String,String>();
hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username"));
hashMap.put(HandleJSON.Key_messageText, jsonarr.getJSONObject(i).getString("chatText"));
hashMap.put(HandleJSON.Key_messageDate, jsonarr.getJSONObject(i).getString("chatDate"));
Log.i("dateeeeeee",jsonarr.getJSONObject(i).getString("chatDate"));
chat.add(hashMap);
}
return chat;
}
catch(JSONException e)
{
return null;
}
}
public static ArrayList<String> ReturnUsersEmail(String jsonData) throws JSONException
{
JSONArray jsonarr=new JSONArray(jsonData);
ArrayList<String> emails=new ArrayList<String>();
for(int i=0;i<jsonarr.length();i++)
{
emails.add(jsonarr.getString(i));
}
return emails;
}
}
public类HandleJSON{
私有静态数组列表聊天;
静态最终字符串键\u username=“username\u Key”;
静态最终字符串Key\u email=“email\u Key”;
静态最终字符串键\u messageText=“messageText\u Key”;
静态最终字符串键\u messageDate=“messageDate\u Key”;
静态最终字符串键\u messageCounts=“messageCount\u Key”;
静态布尔对象;
公共静态ArrayList ParseJsonForLatestChats(字符串jsonData)
{
试一试{
if(HandleJSON.newObject)
{
chat=newarraylist();
}
i(“jsonReturned”,jsonData.toString());
JSONArray jsonarr=新的JSONArray(jsonData);
对于(int i=0;i=0;i--)
{
HashMap HashMap=新的HashMap();
put(HandleJSON.Key_用户名,jsonarr.getJSONObject(i.getString(“用户名”));
put(HandleJSON.Key_messageText,jsonarr.getJSONObject(i.getString(“chatText”));
put(HandleJSON.Key_messageDate,jsonarr.getJSONObject(i.getString)(“chatDate”);
Log.i(“dateeeee”,jsonarr.getJSONObject(i.getString(“chatDate”));
添加(hashMap);
}
回话;
}
捕获(JSONException e)
{
返回null;
}
}
公共静态ArrayList ReturnUsersMail(字符串jsonData)抛出JSONException
{
JSONArray jsonarr=新的JSONArray(jsonData);
ArrayList电子邮件=新建ArrayList();
对于(int i=0;i这需要一个调试器。要么doInBackground
没有被调用(这不太可能),要么你的parsejsonforuseradmincats
返回null。我打赌是后者。一个简单的异常修复方法是将行更改为:
if (null != data && !data.isEmpty())
我认为data
的原因是null
(而不是空的),这是因为HandleJSON.ParseJsonForUserAdminChats()
正在返回null
(请注意,在此之前立即执行的new
是不需要的,也没有帮助的,顺便说一句)。好吧,我确信这不是您真正的代码。
无论如何,如果你能运行它并得到这个异常,你不能用try-catch来处理它吗?
也许您的方法“HandleJSON.ParseJsonForUserAdminChats”正在为对象设置为null,并且isEmpty仅在列表没有元素时处理,如果变量为null则不处理
try {
if(!data.isEmpty()) {
//if data is not null and not empty will pass here
}
} catch(NullPointerException e) {
//If data == null it will pass here
}
您没有正确使用AsyncTask
。
如果阅读中名为AsyncTask的泛型类型的部分,您将了解如何使用泛型类型在doInBackground
和onPostExecute
之间传递数据。
以下是您需要做的:
public class GetPreviousChatNewThread extends AsyncTask<Void,Void,List<HashMap<String, String>>> {
ProgressDialog dialog;
@Override
protected List<HashMap<String, String>> doInBackground(Void... void) {
return HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
"ReturnUserAdminChats",
"admin",
"You" ,
"a",
clientEmail,
UserAdminChatActivity.LastShowingChatDate));
}
@Override
protected void onPostExecute(List<HashMap<String, String>> result) {
super.onPostExecute(result);
if(null != result && !result.isEmpty()) { //checks not null or empty
adapter.InsertValuesAtTop(result);
}
else
{
Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
}
if(dialog.isShowing())
dialog.dismiss();
}
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
}
}
公共类GetPreviousChatNewThread扩展异步任务{
进程对话;
@凌驾
受保护列表背景(无效…无效){
返回HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
“ReturnUserAdminChats”,
“管理员”,
“你”,
“a”,
客户邮件,
UserAdminChatActivity.LastShowingChatDate));
}
@凌驾
受保护的void onPostExecute(列表结果){
super.onPostExecute(结果);
if(null!=result&&!result.isEmpty()){//检查不为null或空
adapter.InsertValuesAtTop(结果);
}
其他的
{
Toast.makeText(getApplicationContext(),“无更多数据”,Toast.LENGTH_LONG.show();
}
if(dialog.isShowing())
dialog.dismise();
}
@凌驾
受保护的void onPreExecute(){
dialog=ProgressDialog.show(UserAdminChatActivity.this,“,”正在加载。请稍候…,true);
}
}
如果您得到了一个Toast
,那么您就知道HandleJSON.parsejsonforuseradmincats(…)
返回的数据是null
或者如果(!data.isEmpty())返回一个空的列表
这与数据无关!这与结果有关。所有返回数据都存储在结果中。是的,它返回哈希映射的arraylist,但因为那里没有数据,所以返回null@Mj1992它在同一行上给出了一个空指针异常?如果数据真的是null
,那就不应该是这样了。我不知所措。@Mj1992哦,我想你应该再尝试一件事(尽管我认为这没有关系):去掉returnnull;
行自doInBackground()
@Turix在他的代码中,他无法删除return null;
,因为他会得到一个编译错误。这是因为他没有按预期使用AsyncTask
。(请参阅我的帖子。)@Salil_Pandit是的,看到了,你的代码肯定比他的好。但我仍然不明白,对数据的null检查至少没有避免异常。是的,它返回null,正如我在问题中提到的,现在我只想向用户显示没有数据,那么我如何处理列表ca的nulln请解释一下?你可以像Turix saied那样检查,或者像我将在mu post中发布的编辑一样处理它。嘿,thnx用于回复。我尝试了代码,但它仍然给出相同的错误。我严重怀疑。如果(null!=result&&!result.isEmpty()),你不可能在处收到NPE
。最有可能的情况是,您在HandleJSON.parsejsonforuseradmincats
中获得了一个NPE。您可以发布该代码吗?也许我们可以帮助您找到问题所在。@Mj1992您可以使用我的代码发布日志吗?包括HandleJSON
类中的日志吗?也可以
public class GetPreviousChatNewThread extends AsyncTask<Void,Void,List<HashMap<String, String>>> {
ProgressDialog dialog;
@Override
protected List<HashMap<String, String>> doInBackground(Void... void) {
return HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
"ReturnUserAdminChats",
"admin",
"You" ,
"a",
clientEmail,
UserAdminChatActivity.LastShowingChatDate));
}
@Override
protected void onPostExecute(List<HashMap<String, String>> result) {
super.onPostExecute(result);
if(null != result && !result.isEmpty()) { //checks not null or empty
adapter.InsertValuesAtTop(result);
}
else
{
Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
}
if(dialog.isShowing())
dialog.dismiss();
}
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
}
}