AsyncTask.doInBackground() 方法中的 NetworkOnMainThreadException

NetworkOnMainThreadException inside AsyncTask.doInBackground() method

在尝试在主 UI 线程上进行网络连接时首次遇到此问题。 然后尝试使用 AsyncTask 避免它,但仍然得到相同的异常。 Networkign 仅在 AsyncTask.doInBackground() 方法内部发生。但我仍然得到这个例外。我该如何解决?

public class AsyncRSSLoader extends AsyncTask<Void, Void, RSSData> {
    private String url = "http://www.nasa.gov/rss/dyn/image_of_the_day.rss";


    @Override
    protected RSSData doInBackground(Void... params) {
        try {
            IotHandler handler = new IotHandler();
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader reader = parser.getXMLReader();
            reader.setContentHandler(handler);
            InputStream inputStream = new URL(url).openStream();
            reader.parse(new InputSource(inputStream));

            RSSData data = new RSSData();
            data.setDate(handler.getDate());
            data.setTitle(handler.getTitle());

            data.setImage(getBitmap(handler.getImageUrl()));

            return data;
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("NASA_RSS", e.getStackTrace().toString());
        }

        return null;
    }

}

以及这个class的用法:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AsyncRSSLoader loader = new AsyncRSSLoader();
        RSSData data = loader.doInBackground();

        resetDisplay(data.getTitle(), data.getDate(), data.getImage(), data.getDescription());
    }

你得打电话

loader.execute();

而不是 loader.doInBackground()execute() 从工作线程调用 doInBackground。如果您需要将数据传回 Activity,请使用委托。你可以找到一个例子 here