2016-04-15 20 views
0

私はXmlPullParserを使用しています。これはサーバーからファイルを解析しています。もちろん、別のスレッドで行っています。私はスレッドで動作するためにrxAndroidを使用していますが、それはNetworkOnMainThread例外をスローします。私を助けてください。URL.openStream networkOnMainThread with rxAndroid

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) { 

       } 
      }); 
} 
+0

私はあなたがその例外を取得する理由は、あなたが 'parseArticles()'を呼び出すと思います。 –

+0

@ShadabAnsari UIスレッドからrxメソッドを呼び出すと何が問題になりますか? –

答えて

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) { 

       } 
      }); 
     } 
} 
+0

呼び出しメソッドでxmlparseexceptionを処理する方法は? –

+0

私はあなたがすでにparseArticles()でそれをやっていると思います。 –

+0

あなたのボイドリターンの結果はなぜですか? –

0

あなたは、これは結構ですが、これはXmlPullParserHanlder.parseArticles(get)方法自体のObservable.just(XmlPullParserHanlder.parseArticles(get))とないの結果のためである.subscribeOn(Schedulers.newThread())を使用しています。このようなことを試してください

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

このオブジェクトを購読できません。コードを更新してください –

関連する問題