2015-07-09 5 views
-4

Сначала столкнулся с этим при попытке создания сети в основном потоке пользовательского интерфейса. Затем попытался избежать этого с помощью AsyncTask, но все равно получить то же Исключение. Сетевое взаимодействие происходит только внутри метода AsyncTask.doInBackground(). Но я все еще получаю это исключение. Как это исправить?NetworkOnMainThreadException внутри метода AsyncTask.doInBackground()

public class AsyncRSSLoader extends AsyncTask<Void, Void, RSSData> { 
    private String url = "http://www.nasa.gov/rss/dyn/image_of_the_day.rss"; 


    @Override 
    protected RSSData doInBackground(Void... params) { 
     try { 
      IotHandler handler = new IotHandler(); 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser parser = factory.newSAXParser(); 
      XMLReader reader = parser.getXMLReader(); 
      reader.setContentHandler(handler); 
      InputStream inputStream = new URL(url).openStream(); 
      reader.parse(new InputSource(inputStream)); 

      RSSData data = new RSSData(); 
      data.setDate(handler.getDate()); 
      data.setTitle(handler.getTitle()); 

      data.setImage(getBitmap(handler.getImageUrl())); 

      return data; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("NASA_RSS", e.getStackTrace().toString()); 
     } 

     return null; 
    } 

} 

и использование этого класса:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     AsyncRSSLoader loader = new AsyncRSSLoader(); 
     RSSData data = loader.doInBackground(); 

     resetDisplay(data.getTitle(), data.getDate(), data.getImage(), data.getDescription()); 
    } 

ответ

1

вы должны вызвать

loader.execute(); 

вместо loader.doInBackground(). Это execute(), который вызывает doInBackground из рабочей нити. Если вам нужно передать данные обратно в Activity, используйте делегат. Вы можете найти пример here

Смежные вопросы