![](/img/trans.png)
[英]AsyncTask doInbackground returns arraylist value but in onPostExecute arraylist is 0
[英]ArrayList in onPostExecute(AsyncTask) on Fragment is empty
我在Fragment的onPostExecute(AsyncTask)中使用ArrayList。
问题是我执行AsyncTask后, arrivalInfoArrayList
为空。
我尝试使用
1)
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//Code for the UiThread
}
});
2)
new Handler().post(new Runnable() {
@Override
public void run() {
}
});
但这没有用。 我该如何解决? 这是我的代码。
arrivalAsync = new ArrivalAsync() {
@Override
protected void onPostExecute(String arrivalUrl) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader(arrivalUrl));
int eventType = xpp.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
} else if(eventType == XmlPullParser.START_TAG) {
String tagName = xpp.getName();
switch (tagName) {
case "arsId":
bl_arsId = true;
break;
case "firstTm":
bl_firstTm = true;
break;
case "lastTm":
bl_lastTm = true;
case "stNm":
bl_stNm = true;
break;
}
} else if(eventType == XmlPullParser.TEXT) {
if(bl_arsId) {
arsId = xpp.getText();
arrivalInfo.setArsId(arsId);
bl_arsId = false;
}
if(bl_firstTm) {
firstTm = xpp.getText();
arrivalInfo.setFirstTm(firstTm);
bl_firstTm = false;
}
if(bl_lastTm) {
lastTm = xpp.getText();
arrivalInfo.setLastTm(lastTm);
bl_lastTm = false;
}
if(bl_stNm) {
stNm = xpp.getText();
arrivalInfo.setStNm(stNm);
bl_stNm = false;
}
} else if(eventType == XmlPullParser.END_TAG) {
String tagName = xpp.getName();
if(tagName.equals("itemList")) {
arrivalInfoArrayList.add(arrivalInfo);
arrivalInfo = new ArrivalInfo();
}
}
eventType = xpp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
arrivalAsync.execute(arrivalUrl);
首先,您应该在doInBackround()中进行while循环计算。 您是否还尝试在日志中打印阵列列表大小或尝试调试执行以检查阵列列表中是否添加了任何数据? 如果没有,那么您应该已经完成了基本的家庭作业。
假设arrivalUrl
是一个实际的URL字符串,并且意图是获取/解析URL响应,那么您将需要获得输入流,到达URL端点,如下所示。 但是您必须在background- doInBackground
执行此doInBackground
。
InputStream is = new URL(arrivalUrl).openConnection().getInputStream();
xpp.setInput(is, null);
并在最后关闭流
is.close();
并使用try块包装所有内容,以防可能出现异常。
让doInBackground
返回arraylist并在onPostExecute
中对其进行onPostExecute
。
这是一个演示此问题的答案-您离它不太远-基本上将您的onPostExecute
转换为doInBackground
并返回ArrayList: https : doInBackground
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.