关于AsycTask未运行的问题,我遇到过很多帖子,并想确认这是否确实是我的实施问题。 Should I try to implement this method instead?
我使用new GetRoutes().execute("test");
在我的onCreate方法中调用以下方法。 AsyncTask提供的信息用于构建解析信息的ListView。但是,此方法不会更新“values”数组。
private class GetRoutes extends AsyncTask<String, Void, String[]> {
@Override
protected String[] doInBackground(String... urls) {
List<String> in = new ArrayList<String>();
try{
RouteReader route = new RouteReader();
in = route.parse(new URL(RouteReader.URI).openStream());
} catch(IOException iox){
in.add("Major poopoo");
//in.add(getResources().getString(R.string.loading_error));
} catch(ArrayIndexOutOfBoundsException aiob){
in.add("Minor poopoo");
//in.add(getResources().getString(R.string.loading_error));
} catch(NullPointerException npe){
in.add("Small poopoo");
//in.add(getResources().getString(R.string.loading_error));
} catch (XmlPullParserException e) {
in.add(getResources().getString(R.string.loading_error));
}
return in.toArray(new String[in.size()]);
}
@Override
protected void onPostExecute(String[] result) {
values = result;
}
}
RouteReader类如下:
public class RouteReader {
private XmlPullParser parser;
public final static String URI =
"http://webservices.nextbus.com/service/publicXMLFeed?command=routeList&a=ttc";
public RouteReader(){
parser = Xml.newPullParser();
}
public List<String> parse(InputStream in) throws XmlPullParserException, IOException {
try {
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readFeed(parser);
} finally {
in.close();
}
}
private List<String> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<String> entries = new ArrayList<String>();
parser.require(XmlPullParser.START_TAG, null, "body");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("route")) {
entries.add(parser.getAttributeValue(null, "id"));
System.out.println(parser.getAttributeValue(null, "id"));
}
}
return entries;
}
}
请您帮我解释一下这个实施的问题?
答案 0 :(得分:2)
如果您的doInBackground()
方法未被调用,请尝试像这样调用您的任务,这是一个已知问题:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new GetRoutes().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "test");
else
new GetRoutes().execute("test");
并将其添加到调用asynk任务的方法的顶部,(eclipse会请你这样以防万一..)
@SuppressLint("NewApi")
解决方案更新:
正如我所看到你在调用asynktask后正在实现适配器,但是这个异步,你必须等待适配器直到任务完成,通常这是在onPostExecute()
方法上做的,所以替换你的行
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.list_item, android.R.id.text1, values);
list.setAdapter(adapter);
在onPostExecute()
内,然后重试