【问题标题】:URL.openStream networkOnMainThread using rxAndroid [duplicate]URL.openStream networkOnMainThread 使用 rxAndroid [重复]
【发布时间】:2016-08-07 22:20:12
【问题描述】:

我正在使用从服务器解析文件的 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) {

                }
            });
}

【问题讨论】:

  • 我猜你是从 UI 线程调用 parseArticles(),这就是你得到那个异常的原因。
  • @ShadabAnsari 从 UI 线程调用 rx 方法有什么问题?

标签: java android


【解决方案1】:

问题不在于从 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) {

                }
            });
        }
}

【讨论】:

  • 调用方法中的xmlparseexception如何处理?
  • 我猜你已经在 parseArticles() 中这样做了。
  • 为什么你的 void 返回结果?
  • 您的代码运行良好,我已删除返回命令。谢谢
【解决方案2】:

您使用.subscribeOn(Schedulers.newThread())this 很好,但这是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) {

                }
            });

【讨论】:

  • 我不能订阅这个对象。请更新您的代码
猜你喜欢
  • 1970-01-01
  • 2012-04-02
  • 2013-03-17
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2012-12-29
  • 2014-03-03
相关资源
最近更新 更多