2016-04-15 9 views
0

Ich benutze XmlPullParser, die Datei vom Server analysieren, natürlich mache ich es in einem anderen Thread. Ich benutze rxAndroid, um mit Threads zu arbeiten, aber es wirft NetworkOnMainThread Ausnahme. Bitte hilf mir.URL.openStream networkOnMainThread mit 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; 
} 

Und das ist meine RX-Methode:

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

Ich denke, Sie rufen 'parseArticles()' aus UI-Thread, deshalb erhalten Sie diese Ausnahme. –

+0

@ShadabAnsari Was ist das Problem beim Aufruf der rx-Methode vom UI-Thread? –

Antwort

1

Das Problem ist nicht mit Rx Methoden von UI-Thread aufrufen. Das Problem ist, dass Sie Ihre Netzwerkoperation ausführen, die parseArticles() in Nicht-UI-Thread ist.

können Sie versuchen, diesen Ansatz -

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

Wie behandelt man xmlparseexception in der Aufrufmethode? –

+0

Ich denke, Sie tun es bereits in parseArticles(). –

+0

Warum ist Ihr Void-Return-Ergebnis? –

0

Sie .subscribeOn(Schedulers.newThread()) verwenden das ist in Ordnung, aber das ist für das Ergebnis der Observable.just(XmlPullParserHanlder.parseArticles(get)) und nicht für die XmlPullParserHanlder.parseArticles(get) Methode selbst. Versuchen Sie etwas wie das

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

Ich kann dieses Objekt nicht abonnieren. Bitte aktualisieren Sie Ihren Code –

Verwandte Themen