【问题标题】:Java URL getContent AndroidJava URL getContent Android
【发布时间】:2014-02-16 12:25:49
【问题描述】:

我不知道如何去做我正在做的事情,我只是想很快地把一些东西拼凑起来。

但这就是我所拥有的:

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 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): 关闭 VM 01-25 05:53:54.406: W/dalvikvm(13564): threadid=1: 线程以未捕获的异常退出 (group=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): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpConnection.(HttpConnection.java:70) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpConnection.(HttpConnection.java:50) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 java.net.URL.openStream(URL.java:462) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 com.example.food2forkbarcode.MainActivity.newScanThing(MainActivity.java:60) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 java.lang.reflect.Method.invoke(Method.java:511) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 01-25 05:53:54.421: E/AndroidRuntime(13564): 在 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 Acceleration Sensor delay= 200000 Listener= 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: 线程以未捕获的异常退出 (group=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): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpConnection.(HttpConnection.java:70) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpConnection.(HttpConnection.java:50) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 java.net.URL.openStream(URL.java:462) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 com.example.food2forkbarcode.MainActivity.newScanThing(MainActivity.java:60) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 java.lang.reflect.Method.invoke(Method.java:511) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 01-25 05:54:12.203: E/AndroidRuntime(13768): 在 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,总共44ms 01-25 05:57:28.851: D/dalvikvm(13768): GC_CONCURRENT freed 332K, 11% free 7572K/8455K, paused 16ms+2ms,总共63ms

【问题讨论】:

  • 请向我们展示您的 LogCat。
  • 对不起,什么是 LogCat?我以前从未制作过安卓应用。
  • 想通了,编辑进去了,
  • 请贴出崩溃对应的完整LogCat。您发布的行不相关。
  • 有点过分了,而且没有格式化,但这是正确的,是的;)

标签: java android url


【解决方案1】:

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

  1. 您在这一行中将 InputStream 转换为字符串:

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

    这肯定不是你想要的。

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

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

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

【讨论】:

  • 好的,是的,这听起来很对。呃,那我该怎么做?像 scanData = new String((Bytes[])u.getContent().toString()); ?
  • 我会扩展我的答案。
  • 在我的回答中添加了详细信息。
  • 真的很抱歉,我不知道您在第 2 部分中所说的内容。如何解决此问题?我可以以某种方式制作一个新线程或其他东西吗?如果是这样,你如何制作线程?我在第 1 部分中解决了问题吗?
  • 使用我链接的教程中的代码将解决你所有的问题(除了不会让你睡觉)
【解决方案2】:

您的代码在主线程(应用程序的 UI 线程)上运行。这就是您收到NetworkOnMainThreadException 的原因。

将您的网络代码移至AsyncTask

【讨论】:

    【解决方案3】:

    你可以试试这个:

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

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 1970-01-01
      • 2013-07-11
      • 2018-01-13
      • 2017-08-13
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多