CamelopardalisRex
CamelopardalisRex

Reputation: 363

Java URL getContent Android

I have no idea how to do what I am doing, and I am just trying to hack something together really quickly.

But here's what I've got:

public void newScanThing(String scanFormat, String scanContent){
    URL u;
    try {
        u = new URL("http://www.searchupc.com/handlers/upcsearch.ashx?request_type=3&access_token=A98AC4EC-830D-4F6B-89D6-D6954361A8CA&upc=" + scanContent.toString());
        BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream()));
        String stringBuff;
        String scanData = "";
        while ((stringBuff = br.readLine()) != null){
            scanData += stringBuff;

        }
        br.close();

        formatTxt.setText("FORMAT: " + scanFormat + " DATA: I don't crash.");
    } catch (MalformedURLException mue) {
        // crash
    } catch (IOException ioe) {
        // crash
    }I know which line causes it to crash, and it is the scanData = new ... line. But I have no idea why. If you were to visit the link I visit, you would see the only thing in that URL is a single string. It's not even any HTML or anything, it's just a string.

Here is my function call:

 newScanThing("UPC_A","816983011311");

Anyways, what the heck am I doing wrong? I've never used this before. And I need to get this string for a proof of concept due in about 12 hours, and I have a lot of work to do after I get the string. So tips? Gestures at the right answer?

Maybe just a quick and dirty explanation of what I am doing wrong, how to do it right and why it works that way?

LogCat:

01-25 05:53:42.367: D/libEGL(13564): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so

01-25 05:53:42.382: D/libEGL(13564): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 01-25 05:53:42.390: D/libEGL(13564): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 01-25 05:53:42.492: D/OpenGLRenderer(13564): Enabling debug mode 0 01-25 05:53:42.500: E/SensorManager(13564): thread start 01-25 05:53:42.507: D/SensorManager(13564): registerListener :: handle = 1 name= BMA254 Acceleration Sensor delay= 200000 Listener= android.view.OrientationEventListener$SensorEventListenerImpl@41816ab8 01-25 05:53:42.593: W/IInputConnectionWrapper(13564): showStatusIcon on inactive InputConnection 01-25 05:53:54.406: D/AndroidRuntime(13564): Shutting down VM 01-25 05:53:54.406: W/dalvikvm(13564): threadid=1: thread exiting with uncaught exception (group=0x4106a2a0) 01-25 05:53:54.421: E/AndroidRuntime(13564): FATAL EXCEPTION: main 01-25 05:53:54.421: E/AndroidRuntime(13564): android.os.NetworkOnMainThreadException 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.net.InetAddress.getAllByName(InetAddress.java:214) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpConnection.(HttpConnection.java:70) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpConnection.(HttpConnection.java:50) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 01-25 05:53:54.421: E/AndroidRuntime(13564): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.net.URL.openStream(URL.java:462) 01-25 05:53:54.421: E/AndroidRuntime(13564): at com.example.food2forkbarcode.MainActivity.newScanThing(MainActivity.java:60) 01-25 05:53:54.421: E/AndroidRuntime(13564): at com.example.food2forkbarcode.MainActivity.onClick(MainActivity.java:28) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.view.View.performClick(View.java:4222) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.view.View$PerformClick.run(View.java:17273) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.os.Handler.handleCallback(Handler.java:615) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.os.Handler.dispatchMessage(Handler.java:92) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.os.Looper.loop(Looper.java:137) 01-25 05:53:54.421: E/AndroidRuntime(13564): at android.app.ActivityThread.main(ActivityThread.java:4895) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.lang.reflect.Method.invokeNative(Native Method) 01-25 05:53:54.421: E/AndroidRuntime(13564): at java.lang.reflect.Method.invoke(Method.java:511) 01-25 05:53:54.421: E/AndroidRuntime(13564): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 01-25 05:53:54.421: E/AndroidRuntime(13564): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 01-25 05:53:54.421: E/AndroidRuntime(13564): at dalvik.system.NativeStart.main(Native Method) 01-25 05:54:02.820: I/Process(13564): Sending signal. PID: 13564 SIG: 9 01-25 05:54:10.656: D/libEGL(13768): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so 01-25 05:54:10.664: D/libEGL(13768): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 01-25 05:54:10.671: D/libEGL(13768): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 01-25 05:54:10.781: D/OpenGLRenderer(13768): Enabling debug mode 0 01-25 05:54:10.789: E/SensorManager(13768): thread start 01-25 05:54:10.789: D/SensorManager(13768): registerListener :: handle = 1 name= BMA254 Acceleration Sensor delay= 200000 Listener= android.view.OrientationEventListener$SensorEventListenerImpl@41813160 01-25 05:54:12.187: D/AndroidRuntime(13768): Shutting down VM 01-25 05:54:12.187: W/dalvikvm(13768): threadid=1: thread exiting with uncaught exception (group=0x4106a2a0) 01-25 05:54:12.203: E/AndroidRuntime(13768): FATAL EXCEPTION: main 01-25 05:54:12.203: E/AndroidRuntime(13768): android.os.NetworkOnMainThreadException 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.net.InetAddress.getAllByName(InetAddress.java:214) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpConnection.(HttpConnection.java:70) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpConnection.(HttpConnection.java:50) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 01-25 05:54:12.203: E/AndroidRuntime(13768): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.net.URL.openStream(URL.java:462) 01-25 05:54:12.203: E/AndroidRuntime(13768): at com.example.food2forkbarcode.MainActivity.newScanThing(MainActivity.java:60) 01-25 05:54:12.203: E/AndroidRuntime(13768): at com.example.food2forkbarcode.MainActivity.onClick(MainActivity.java:28) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.view.View.performClick(View.java:4222) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.view.View$PerformClick.run(View.java:17273) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.os.Handler.handleCallback(Handler.java:615) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.os.Handler.dispatchMessage(Handler.java:92) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.os.Looper.loop(Looper.java:137) 01-25 05:54:12.203: E/AndroidRuntime(13768): at android.app.ActivityThread.main(ActivityThread.java:4895) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.lang.reflect.Method.invokeNative(Native Method) 01-25 05:54:12.203: E/AndroidRuntime(13768): at java.lang.reflect.Method.invoke(Method.java:511) 01-25 05:54:12.203: E/AndroidRuntime(13768): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 01-25 05:54:12.203: E/AndroidRuntime(13768): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 01-25 05:54:12.203: E/AndroidRuntime(13768): at dalvik.system.NativeStart.main(Native Method) 01-25 05:55:03.835: D/dalvikvm(13768): GC_CONCURRENT freed 245K, 9% free 7464K/8199K, paused 6ms+3ms, total 44ms 01-25 05:57:28.851: D/dalvikvm(13768): GC_CONCURRENT freed 332K, 11% free 7572K/8455K, paused 16ms+2ms, total 63ms

Upvotes: 0

Views: 1568

Answers (3)

Luc
Luc

Reputation: 2805

You can try this:

A child of AsyncTask

public class AsyncLoadData extends AsyncTask<String, Void, String> {
    private Context mContext;
    private ILoadDataListener mListener;

    public AsyncLoadData(Context context, ILoadDataListener listener) {
        this.mContext = context;
        this.mListener = listener;
    }

    @Override
    protected String doInBackground(String... params) {
                String url = params[0];
        String result = doGetStringFromUrl(url); // You can write your own method;
                return result;
    }

    @Override
    protected void onPostExecute(String result) {
        mListener.complete(result);
    }

    @Override
    protected void onPreExecute() {
        mListener.loading();
    }

    public interface ILoadDataListener {
        void loading();

        void complete(String result);
    }
}

In your activity

public class MainActivity extends Activity implements AsyncLoadData.ILoadDataListener {
      /// Something...
     public void getData() {
         new AsyncLoadData(this, this).execute(url);
         // or new AsyncLoadData(getBaseContext(), this).execute(url);
     }

     @Override
     public void loading() {
        // Do something here when you start download and downloading text
     }

     @Override
     public void complete(String result) {
         TextView mTextView = (TextView) findViewById(R.id.your_text_view);
         mTextView.setText(result);
     }
}

Upvotes: 0

Elad Nava
Elad Nava

Reputation: 7906

Your code is running on the Main Thread - the application's UI thread. This is why you are getting a NetworkOnMainThreadException.

Move your network code to an AsyncTask.

Upvotes: 0

FD_
FD_

Reputation: 12919

There are actually multiple issues in your code:

  1. You are converting an InputStream to a String in this line:

    scanData = new String(u.getContent().toString());
    

    Which certainly is not what you want.

    An InputStream provides you the way to get data, but it does not represent the data itself. You have to read the bytes from the InputStream before initializing any String.

  2. You are doing a networking operation on the main thread. The problem is that networking operations take time, and if you perform them on the UI thread, you will block the UI, the app will get unresponsive. For this reason, performing Networking activity on the UI thread is prohibited by the System and causes the android.os.NetworkOnMainThreadException that is crashing your app. You'll have to move your networking code to another thread. I'd recommend an AsyncTask for that.

Have a look at a networking tutorial like this one: http://android-er.blogspot.co.at/2012/04/androidosnetworkonmainthreadexception.html

Upvotes: 1

Related Questions