我使用的是从服务器解析文件的XmlPullParser,当然是在另一个线程中进行的。我使用rxAndroid来处理线程,但它会引发NetworkOnMainThread异常。请帮帮我。
public static List<ArticleModel> parseArticles(String get) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
URL url = new URL(get);
**parser.setInput(url.openStream(),null);** // HERE GOES THE EXCEPTION
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("article")) {
// create a new instance of employee
articleModel =new ArticleModel();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("article")) {
// add employee object to list
articleModelList.add(articleModel);
}else if (tagname.equalsIgnoreCase("id")) {
articleModel.setId(text);
} else if (tagname.equalsIgnoreCase("name")) {
articleModel.setName(text);
} else if (tagname.equalsIgnoreCase("image_url")) {
articleModel.setImage_url(text);
}
else if (tagname.equalsIgnoreCase("url")) {
articleModel.setUrl(text);
}
else if (tagname.equalsIgnoreCase("type")) {
articleModel.setType(text);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {e.printStackTrace();}
catch (IOException e) {e.printStackTrace();}
return articleModelList;
}这是我的RX方法:
public void getArticles(String get, final boolean needRefresh) throws IOException {
Observable.just(XmlPullParserHanlder.parseArticles(get))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<ArticleModel>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i("SIZE", "onNext: "+ e.toString());
}
@Override
public void onNext(List<ArticleModel> articleModels) {
}
});
}发布于 2016-04-15 22:18:22
问题不在于从UI线程调用Rx方法。问题是,您必须在非UI线程中执行网络操作,即parseArticles()。
你可以试试这个方法-
public void getArticles(String get, final boolean needRefresh) throws IOException {
Observable.create(new Observable.OnSubscribe<List< ArticleModel >>() {
@Override
public void call(Subscriber<? super List< ArticleModel >> subscriber) {
subscriber.onNext(parseArticles(get));
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<ArticleModel>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i("SIZE", "onNext: "+ e.toString());
}
@Override
public void onNext(List<ArticleModel> articleModels) {
}
});
}
}发布于 2016-04-15 22:23:58
您可以使用.subscribeOn(Schedulers.newThread())--这很好,但这是Observable.just(XmlPullParserHanlder.parseArticles(get))的结果,而不是XmlPullParserHanlder.parseArticles(get)方法本身。试试像这样的东西
Observable.just(get)
.subscribeOn(Schedulers.newThread())
.map(url -> XmlPullParserHanlder.parseArticles(url))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<ArticleModel>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i("SIZE", "onNext: "+ e.toString());
}
@Override
public void onNext(List<ArticleModel> articleModels) {
}
});https://stackoverflow.com/questions/36655687
复制相似问题