Java URL getContent Android

时间:2014-01-25 12:57:07

标签: java android url

我不知道如何做我正在做的事情,而我只是想快速地将一些东西放在一起。

但这就是我所拥有的:

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.

这是我的函数调用:

 newScanThing("UPC_A","816983011311");

无论如何,我做错了什么?我以前从没用过这个。我需要在大约12个小时内得到这个字符串以获得概念证明,并且在我得到字符串之后我还有很多工作要做。那么提示?正确答案的手势?

也许只是一个快速而肮脏的解释我做错了什么,怎么做对,为什么这样做?

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):已加载/vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 01-25 05:53:42.390:D / libEGL(13564):已加载/vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 01-25 05:53:42.492:D / OpenGLRenderer(13564):启用调试模式0 01-25 05:53:42.500:E / SensorManager(13564):线程启动 01-25 05:53:42.507:D / SensorManager(13564):registerListener :: handle = 1 name = BMA254加速传感器延迟= 200000监听器= android.view.OrientationEventListener$SensorEventListenerImpl@41816ab8 01-25 05:53:42.593:W / IInputConnectionWrapper(13564):showStatusIcon在非活动的InputConnection上 01-25 05:53:54.406:D / AndroidRuntime(13564):关闭虚拟机 01-25 05:53:54.406:W / dalvikvm(13564):threadid = 1:线程退出未捕获异常(组= 0x4106a2a0) 01-25 05:53:54.421:E / AndroidRuntime(13564):致命异常:主要 01-25 05:53:54.421:E / AndroidRuntime(13564):android.os.NetworkOnMainThreadException 01-25 05:53:54.421:E / AndroidRuntime(13564):在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):在android.view.View.performClick(View.java:4222) 01-25 05:53:54.421:E / AndroidRuntime(13564):在android.view.View $ PerformClick.run(View.java:17273) 01-25 05:53:54.421:E / AndroidRuntime(13564):在android.os.Handler.handleCallback(Handler.java:615) 01-25 05:53:54.421:E / AndroidRuntime(13564):在android.os.Handler.dispatchMessage(Handler.java:92) 01-25 05:53:54.421:E / AndroidRuntime(13564):在android.os.Looper.loop(Looper.java:137) 01-25 05:53:54.421:E / AndroidRuntime(13564):在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):发送信号。 PID:13564 SIG:9 01-25 05:54:10.656:D / libEGL(13768):已加载/vendor/lib/egl/libEGL_POWERVR_SGX540_120.so 01-25 05:54:10.664:D / libEGL(13768):已加载/vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 01-25 05:54:10.671:D / libEGL(13768):已加载/vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 01-25 05:54:10.781:D / OpenGLRenderer(13768):启用调试模式0 01-25 05:54:10.789:E / SensorManager(13768):线程启动 01-25 05:54:10.789:D / SensorManager(13768):registerListener :: handle = 1 name = BMA254加速传感器延迟= 200000监听器= android.view.OrientationEventListener$SensorEventListenerImpl@41813160 01-25 05:54:12.187:D / AndroidRuntime(13768):关闭VM 01-25 05:54:12.187:W / dalvikvm(13768):threadid = 1:线程退出未捕获异常(组= 0x4106a2a0) 01-25 05:54:12.203:E / AndroidRuntime(13768):致命异常:主要 01-25 05:54:12.203:E / AndroidRuntime(13768):android.os.NetworkOnMainThreadException 01-25 05:54:12.203:E / AndroidRuntime(13768):在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):在android.view.View.performClick(View.java:4222) 01-25 05:54:12.203:E / AndroidRuntime(13768):在android.view.View $ PerformClick.run(View.java:17273) 01-25 05:54:12.203:E / AndroidRuntime(13768):在android.os.Handler.handleCallback(Handler.java:615) 01-25 05:54:12.203:E / AndroidRuntime(13768):在android.os.Handler.dispatchMessage(Handler.java:92) 01-25 05:54:12.203:E / AndroidRuntime(13768):在android.os.Looper.loop(Looper.java:137) 01-25 05:54:12.203:E / AndroidRuntime(13768):在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释放245K,9%空闲7464K / 8199K,暂停6ms + 3ms,总计44ms 01-25 05:57:28.851:D / dalvikvm(13768):GC_CONCURRENT释放332K,11%免费7572K / 8455K,暂停16ms + 2ms,总计63ms

3 个答案:

答案 0 :(得分:1)

您的代码实际上存在多个问题:

  1. 您正在将InputStream转换为此行中的String:

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

    这当然不是你想要的。

    InputStream为您提供方式来获取数据,但它并不代表数据本身。在初始化任何String之前,您必须从InputStream中读取字节。

  2. 您正在主线程上进行网络操作。问题是网络操作需要时间,如果你在UI线程上执行它们,你将阻止UI,应用程序将无法响应。因此,系统禁止在UI线程上执行网络活动,并导致导致应用程序崩溃的android.os.NetworkOnMainThreadException。您必须将您的网络代码移动到另一个线程。我建议使用AsyncTask

  3. 看看像这样的网络教程:http://android-er.blogspot.co.at/2012/04/androidosnetworkonmainthreadexception.html

答案 1 :(得分:0)

您的代码在主线程上运行 - 应用程序的UI线程。这就是您获得NetworkOnMainThreadException

的原因

将您的网络代码移至AsyncTask

答案 2 :(得分:0)

你可以试试这个:

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

活动

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