首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用URL.openStream networkOnMainThread的rxAndroid

使用URL.openStream networkOnMainThread的rxAndroid
EN

Stack Overflow用户
提问于 2016-04-15 19:48:27
回答 2查看 153关注 0票数 0

我使用的是从服务器解析文件的XmlPullParser,当然是在另一个线程中进行的。我使用rxAndroid来处理线程,但它会引发NetworkOnMainThread异常。请帮帮我。

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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) {

                }
            });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 22:18:22

问题不在于从UI线程调用Rx方法。问题是,您必须在非UI线程中执行网络操作,即parseArticles()

你可以试试这个方法-

代码语言:javascript
复制
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) {

                }
            });
        }
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-15 22:23:58

您可以使用.subscribeOn(Schedulers.newThread())--这很好,但这是Observable.just(XmlPullParserHanlder.parseArticles(get))的结果,而不是XmlPullParserHanlder.parseArticles(get)方法本身。试试像这样的东西

代码语言:javascript
复制
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) {

                }
            });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36655687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档