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
在尝试在主 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