0

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

9
  • Please show us your LogCat. Commented Jan 25, 2014 at 13:00
  • I'm sorry, what is LogCat? I've never made an adroid app before. Commented Jan 25, 2014 at 13:01
  • Figured it out, editing it in., Commented Jan 25, 2014 at 13:02
  • Please post the FULL LogCat corresponding to the crash. The line you posted is not relevant. Commented Jan 25, 2014 at 13:03
  • 1
    It's a bit too much, and not formatted, but it's the right thing, yes ;) Commented Jan 25, 2014 at 13:10

3 Answers 3

1

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

Sign up to request clarification or add additional context in comments.

12 Comments

Ok, yeah, that sounds about right. Uh, so how do I do that? something like scanData = new String((Bytes[])u.getContent().toString()); ?
I'll extend my answer.
Added details to my answer.
I'm really sorry, I don't have any idea what you're saying in part 2. How do I fix this issue? Can I somehow make a new thread or something? How do you make threads, if so? Did I solve the issue in part 1?
Using code like in the tutorial I linked will solve all your problems (except won't get you sleep)
|
0

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.

Comments

0

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);
     }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.