java - 使用 rxAndroid 的 URL.openStream networkOnMainThread

标签 java android

我正在使用 XmlPullParser 从服务器解析文件,当然我是在另一个线程中执行的。我正在使用 rxAndroid 来处理线程,但它抛出 NetworkOnMainThread异常(exception)。请帮助我。

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 线程调用 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) {

                }
            });
        }
}

关于java - 使用 rxAndroid 的 URL.openStream networkOnMainThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36655687/

相关文章:

java - 与 Maven 的雪花连接,类路径上的 jar

java - 我们可以通过使用 resource-id/ID uisng appium 来实现 ios webview 应用程序自动化吗

android - 无法打开捕获的或图库中选择的图像

android - 我怎么知道用户触摸了哪里?(AIR for android)

java - 我如何从推送通知服务获取消息并显示到我的消息 Activity

java - 在 Websphere 门户中将元标记添加到 JSR 286 portlet 的头元素

java - 如何使用 mockito 测试运行异步线程的方法

java - 找不到符号方法 addOnPageChangeListener

android - 如何在android中通过蓝牙向配对设备发送短信?

android - 如何在BaseAdapter中使用DatePickerDialog