AsyncTask不执行

时间:2014-01-02 20:33:55

标签: java android android-asynctask

关于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;
        }
    }

请您帮我解释一下这个实施的问题?

1 个答案:

答案 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()内,然后重试