java - AsycTask 不执行

标签 java android android-asynctask

我看过很多关于 AsycTask 未运行问题的帖子,想确认这是否确实是我的实现问题。 Should I try to implement this method instead?

我使用 new GetRoutes().execute("test"); 在 onCreate 方法中调用以下方法。 AsyncTask 提供的信息用于构建已解析信息的 ListView。但是,此方法不会按应有的方式更新“值”数组。

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

你能帮我查明这个实现的问题吗?

最佳答案

如果您的 doInBackground() 方法没有被调用,请尝试像这样调用您的任务,这是一个已知问题:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    new GetRoutes().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "test");
else
    new GetRoutes().execute("test");

并将其添加到调用异步任务的方法的顶部,(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() 中,然后重试

关于java - AsycTask 不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891374/

相关文章:

Android 从第二个线程访问 UI

Java (Android) - 同步队列和发送数据

android - 如何在异步任务的 onPostExecute() 方法中隐藏 android 键盘?

java - 使用 Java 从 XSL-FO 生成 HTML

java - CSV 到命令行中制表符分隔的 java

java.net.SocketException : Connection reset

java - 安卓异步任务 : Is inner class necessary?

java - Spring Boot/Spring Data/Hibernate 入门

android - Android 上的蓝牙打印

android - 如何制作阻塞的 Android HttpRequest