0

Using the accepted answer here, I am trying to download a xml file:

public void get_flickr(double lat,double lang) {
    String flickr_api="https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=";
    String flickr_key="key";
    String flickr_opt="&format=rest&accuracy=11&content_type=1&privacy_filter=1&geo_context=2";
    String urls = flickr_api+flickr_key+"&lat="+lat+"&long="+lang+flickr_opt;
    try {
      URL url = new URL(urls);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.connect();
      File file = new File(getApplicationContext().getFilesDir(), "flickr.xml");
      FileOutputStream fOut =new FileOutputStream(file);
      InputStream fInp = connection.getInputStream();
      int totalSize = connection.getContentLength();

      //variable to store total downloaded bytes
      int downloadedSize = 0;

      //create a buffer...
      byte[] buffer = new byte[1024];
      int bufferLength = 0; //used to store a temporary size of the buffer

      //now, read through the input buffer and write the contents to the file
      while ( (bufferLength = fInp.read(buffer)) > 0 ) {
        //add the data in the buffer to the file in the file output stream (the file on the sd card
        fOut.write(buffer, 0, bufferLength);
        //add up the size so we know how much is downloaded
        downloadedSize += bufferLength;

      }
      //close the output stream when done
      fOut.close();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

which is giving error:

android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
    at java.net.Socket.connect(Socket.java:621)
    at com.android.okhttp.internal.Platform.connectSocket(Platform.java:182)
    at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:145)
    at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
    at com.example.phocast.MainActivity.get_flickr(MainActivity.java:336)
    at com.example.phocast.MainActivity.setupViewPager(MainActivity.java:189)
    at com.example.phocast.MainActivity.access$100(MainActivity.java:60)
    at com.example.phocast.MainActivity$2.onComplete(MainActivity.java:237)
    at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

where:

line 336 :     connection.connect();
    line 189 :     get_flickr(Lat, Long);

what I am doing wrong here?

Kindly help

BaRud
  • 3,055
  • 7
  • 41
  • 89

1 Answers1

4

The problem is that you are trying to run a network operation, which is a blocking operation, on the Main Thread so instead use an AsyncTask and do all the work in the background (another thread).

Also check the following answer.

davidm
  • 1,570
  • 11
  • 24