0

I'm developing a weather android app that reads an XML file from the web, and displays the current temperature. This code works perfectly fine in a normal project within eclipse. I made slight changes to it but it crashes the app when I click the button. In my layout I just have a button added which is programmed in the code.

package ali.androidtest;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.button);

        button.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        try {
                            System.out.println("hello");
                            URL xmlUrl = new URL("http://api.openweathermap.org/data/2.5/weather?q=dallas%20ga&units=metric&mode=xml");
                            System.out.println("hi");
                            InputStream in = xmlUrl.openStream();
                            Document doc = parse(in);


                            doc.getDocumentElement().normalize();


                            NodeList nList = doc.getElementsByTagName("temperature");

                            System.out.println("----------------------------");

                            for (int temp = 0; temp < nList.getLength(); temp++) {

                                Node nNode = nList.item(temp);


                                if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                                    Element eElement = (Element) nNode;

                                    System.out.println("Temperature: " + eElement.getAttribute("value"));


                                }
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
        );


    }
    public static Document parse (InputStream is) {
        Document ret = null;
        DocumentBuilderFactory domFactory;
        DocumentBuilder builder;

        try {
            domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setValidating(false);
            domFactory.setNamespaceAware(false);
            builder = domFactory.newDocumentBuilder();

            ret = builder.parse(is);
        }
        catch (Exception ex) {
            System.err.println("unable to load XML: " + ex);
        }
        return ret;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Here's the logcat:

02-14 03:50:19.906    7483-7483/ali.androidtest I/art﹕ Late-enabling -Xcheck:jni
02-14 03:50:20.015    7483-7483/ali.androidtest D/ContextHelper﹕ convertTheme. context->name=ali.androidtest themeResourceId=2131427328
02-14 03:50:20.031    7483-7483/ali.androidtest I/PhoneWindow﹕ [generateLayout] setColorNavigationBar => color=0x ff000001
02-14 03:50:20.040    7483-7483/ali.androidtest D/PhoneWindowEx﹕ [PWEx][generateLayout] setNavigationBarColor2 : colors=0xff000000
02-14 03:50:20.040    7483-7483/ali.androidtest I/PhoneWindow﹕ [setNavigationBarColor2] color=0x ff000000
02-14 03:50:20.342    7483-7537/ali.androidtest D/OpenGLRenderer﹕ Render dirty regions requested: true
02-14 03:50:20.348    7483-7537/ali.androidtest I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
    OpenGL ES Shader Compiler Version: E031.25.03.00
    Build Date: 12/12/14 금
    Local Branch: LA.BF.1.1_RB1.05.00.00.002.031_20141212_01821442
    Remote Branch:
    Local Patches:
    Reconstruct Branch:
02-14 03:50:20.363    7483-7537/ali.androidtest I/OpenGLRenderer﹕ Initialized EGL, version 1.4
02-14 03:50:20.482    7483-7537/ali.androidtest D/OpenGLRenderer﹕ Enabling debug mode 0
02-14 03:50:20.490    7483-7483/ali.androidtest D/Atlas﹕ Validating map...
02-14 03:50:20.859    7483-7483/ali.androidtest I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@12f1cbb0 time:36076139
02-14 03:54:23.267    7483-7493/ali.androidtest I/art﹕ Debugger is no longer active
02-14 03:54:59.218    8815-8815/ali.androidtest D/ContextHelper﹕ convertTheme. context->name=ali.androidtest themeResourceId=2131427328
02-14 03:54:59.233    8815-8815/ali.androidtest I/PhoneWindow﹕ [generateLayout] setColorNavigationBar => color=0x ff000001
02-14 03:54:59.236    8815-8815/ali.androidtest D/PhoneWindowEx﹕ [PWEx][generateLayout] setNavigationBarColor2 : colors=0xff000000
02-14 03:54:59.236    8815-8815/ali.androidtest I/PhoneWindow﹕ [setNavigationBarColor2] color=0x ff000000
02-14 03:54:59.338    8815-8850/ali.androidtest D/OpenGLRenderer﹕ Render dirty regions requested: true
02-14 03:54:59.339    8815-8850/ali.androidtest I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
    OpenGL ES Shader Compiler Version: E031.25.03.00
    Build Date: 12/12/14 금
    Local Branch: LA.BF.1.1_RB1.05.00.00.002.031_20141212_01821442
    Remote Branch:
    Local Patches:
    Reconstruct Branch:
02-14 03:54:59.340    8815-8850/ali.androidtest I/OpenGLRenderer﹕ Initialized EGL, version 1.4
02-14 03:54:59.356    8815-8850/ali.androidtest D/OpenGLRenderer﹕ Enabling debug mode 0
02-14 03:54:59.362    8815-8815/ali.androidtest D/Atlas﹕ Validating map...
02-14 03:54:59.536    8815-8815/ali.androidtest I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@12f1cbb0 time:36354815
02-14 03:55:08.961    8815-8815/ali.androidtest I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_DOWN
02-14 03:55:09.032    8815-8815/ali.androidtest I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_UP
02-14 03:55:09.041    8815-8815/ali.androidtest I/System.out﹕ hello
02-14 03:55:09.041    8815-8815/ali.androidtest I/System.out﹕ hi
02-14 03:55:09.054    8815-8815/ali.androidtest D/libc-netbsd﹕ [getaddrinfo]: hostname=xxxxx; servname=(null); cache_mode=(null), netid=0; mark=0
02-14 03:55:09.054    8815-8815/ali.androidtest D/libc﹕ getaddrinfo called from pid =8815
02-14 03:55:09.054    8815-8815/ali.androidtest D/libc-netbsd﹕ [getaddrinfo]: ai_addrlen=0; ai_canonname=xxxxx; ai_flags=4; ai_family=0
02-14 03:55:09.058    8815-8815/ali.androidtest D/AndroidRuntime﹕ Shutting down VM
02-14 03:55:09.066    8815-8815/ali.androidtest E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: ali.androidtest, PID: 8815
    android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:426)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:255)
            at java.net.InetAddress.getAllByName(InetAddress.java:218)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at ali.androidtest.MainActivity$1.onClick(MainActivity.java:34)
            at android.view.View.performClick(View.java:4764)
            at android.view.View$PerformClick.run(View.java:19833)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5292)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

New Code that I used using Async:

package ali.projecto;

import android.app.Activity;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class MainActivity extends Activity {
    public static Document parse (InputStream is) {
        Document ret = null;
        DocumentBuilderFactory domFactory;
        DocumentBuilder builder;

        try {
            domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setValidating(false);
            domFactory.setNamespaceAware(false);
            builder = domFactory.newDocumentBuilder();

            ret = builder.parse(is);
        }
        catch (Exception ex) {
            System.err.println("unable to load XML: " + ex);
        }
        return ret;
    }

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

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                new MyAsyncTask().execute();
            }
        });
    }

    // Somewhere the AsyncTask is started

    public class MyAsyncTask extends AsyncTask<Void, Void, String> {

        @Override protected String doInBackground(Void... params) {
            try {
                System.out.println("hello");
                URL xmlUrl = new URL("http://api.openweathermap.org/data/2.5/weather?q=dallas%20ga&units=metric&mode=xml");
                System.out.println("hi");
                InputStream in = xmlUrl.openStream();
                Document doc = parse(in);


                doc.getDocumentElement().normalize();


                NodeList nList = doc.getElementsByTagName("temperature");

                System.out.println("----------------------------");

                for (int temp = 0; temp < nList.getLength(); temp++) {

                    Node nNode = nList.item(temp);


                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                        Element eElement = (Element) nNode;

                        System.out.println("Temperature: " + eElement.getAttribute("value"));


                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String result="";
            return result;
        }

        @Override protected void onPostExecute(String result) {
            Log.d("MyAsyncTask", "Received result: " + result);
        }
    }
}

New Error log:

02-14 18:28:51.690  23588-23588/ali.projecto I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@28d58dd6 time:62449387
02-14 18:28:54.266  23588-23588/ali.projecto I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_DOWN
02-14 18:28:54.291  23588-23588/ali.projecto I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_UP
02-14 18:28:54.316  23588-23822/ali.projecto I/System.out﹕ hello
02-14 18:28:54.319  23588-23822/ali.projecto I/System.out﹕ hi
02-14 18:28:54.359  23588-23822/ali.projecto D/libc-netbsd﹕ [getaddrinfo]: hostname=xxxxx; servname=(null); cache_mode=(null), netid=0; mark=0
02-14 18:28:54.359  23588-23822/ali.projecto D/libc﹕ getaddrinfo called from pid =23588
02-14 18:28:54.359  23588-23822/ali.projecto D/libc-netbsd﹕ [getaddrinfo]: ai_addrlen=0; ai_canonname=xxxxx; ai_flags=4; ai_family=0
02-14 18:28:54.360  23588-23822/ali.projecto D/libc-netbsd﹕ [getaddrinfo]: hostname=xxxxx; servname=(null); cache_mode=(null), netid=0; mark=0
02-14 18:28:54.360  23588-23822/ali.projecto D/libc﹕ getaddrinfo called from pid =23588
02-14 18:28:54.360  23588-23822/ali.projecto D/libc-netbsd﹕ [getaddrinfo]: ai_addrlen=0; ai_canonname=xxxxx; ai_flags=1024; ai_family=0
02-14 18:28:54.360  23588-23822/ali.projecto D/libc﹕ dnsproxy getaddrinfo returns 7
02-14 18:28:54.363  23588-23822/ali.projecto E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: ali.projecto, PID: 23588
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:472)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:255)
            at java.net.InetAddress.getAllByName(InetAddress.java:218)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:64)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:57)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
            at libcore.io.Posix.android_getaddrinfo(Native Method)
            at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:446)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:255)
            at java.net.InetAddress.getAllByName(InetAddress.java:218)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:64)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:57)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
            at libcore.io.Posix.android_getaddrinfo(Native Method)
            at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:446)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:255)
            at java.net.InetAddress.getAllByName(InetAddress.java:218)
            at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
            at java.net.URL.openStream(URL.java:470)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:64)
            at ali.projecto.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:57)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
02-14 18:28:54.756  23588-23626/ali.projecto D/OpenGLRenderer﹕ endAllStagingAnimators on 0xa9afed00 (RippleDrawable) with handle 0xaf42dd80
02-14 18:29:46.393  24353-24353/ali.projecto I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_DOWN
02-14 18:29:46.471  24353-24353/ali.projecto I/ViewRootImpl﹕ ViewRoot's Touch Event : ACTION_UP
02-14 18:29:46.477  24353-24430/ali.projecto I/System.out﹕ hello
02-14 18:29:46.477  24353-24430/ali.projecto I/System.out﹕ hi

Can you please guide me more. I'm pretty much a noob in android development.

Muhammad Ali
  • 3,478
  • 5
  • 19
  • 30
  • Whats the error you getting..paste the logs – Psypher Feb 14 '15 at 08:02
  • possible duplicate of [android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) –  Feb 14 '15 at 09:56

1 Answers1

1

NetworkOnMainThreadException means that you are trying to perform networking calls on the main thread of the application. This is not appropriate to do. You should spawn a thread to do networking calls, e.g. AsyncTask or with a Handler.

For example:

Thread thread = new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            //Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start();

Check this question for reference.

Edit:

java.lang.SecurityException: Permission denied (missing INTERNET permission?)

This is saying that you need to add a uses-permission in your manifest.

In your AndroidManifest.xml file, inside the <application> tag, add:

<uses-permission android:name="android.permission.INTERNET" />
Community
  • 1
  • 1
Marcus
  • 6,697
  • 11
  • 46
  • 89
  • Funny how I put that in my original project but not the updated one. At last I got a fairly easy app to work. Now I just need to understand the code I copied :D. I LOVE YOU NO HOMO! – Muhammad Ali Feb 15 '15 at 00:03
  • Good luck with that :-) also, if this answer solved your issue, please tick it as accepted :-) happy coding! @SnowTauren – Marcus Feb 15 '15 at 00:05