Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android在发送URL字符串之前确保LAN上的URL处于活动状态_Android - Fatal编程技术网

Android在发送URL字符串之前确保LAN上的URL处于活动状态

Android在发送URL字符串之前确保LAN上的URL处于活动状态,android,Android,我的应用程序通过http通过wifi将通信从android设备发送到路由器,并最终到达设备。此字符串完全取决于LAN上设备的ip地址 字符串如下所示: http://*standardstuff*(networkIP)*finishingstuff* 只要设备在网络上,我就可以完美地发送和接收通信。但是,如果设备不再在网络上,或者在应用程序运行时其ip发生了变化,我就会遇到问题。我得到以下错误 07-14 15:22:40.656: I/System.out(14655): I-O side

我的应用程序通过http通过wifi将通信从android设备发送到路由器,并最终到达设备。此字符串完全取决于LAN上设备的ip地址

字符串如下所示:

http://*standardstuff*(networkIP)*finishingstuff*
只要设备在网络上,我就可以完美地发送和接收通信。但是,如果设备不再在网络上,或者在应用程序运行时其ip发生了变化,我就会遇到问题。我得到以下错误

07-14 15:22:40.656: I/System.out(14655): I-O side Error
07-14 15:22:40.656: W/System.err(14655): org.apache.http.conn.ConnectTimeoutException: Connect to /10.0.0.29:80 timed out
07-14 15:22:40.660: W/System.err(14655):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
07-14 15:22:40.664: W/System.err(14655):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:159)
07-14 15:22:40.664: W/System.err(14655):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-14 15:22:40.664: W/System.err(14655):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-14 15:22:40.667: W/System.err(14655):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
07-14 15:22:40.667: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-14 15:22:40.671: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-14 15:22:40.675: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-14 15:22:40.675: W/System.err(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:608)
07-14 15:22:40.675: W/System.err(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:1)
07-14 15:22:40.679: W/System.err(14655):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-14 15:22:40.679: W/System.err(14655):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-14 15:22:40.683: W/System.err(14655):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-14 15:22:40.683: W/System.err(14655):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-14 15:22:40.687: W/System.err(14655):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-14 15:22:40.687: W/System.err(14655):    at java.lang.Thread.run(Thread.java:1019)
07-14 15:22:40.691: W/dalvikvm(14655): threadid=12: thread exiting with uncaught exception     (group=0x40015578)
07-14 15:22:40.726: E/AndroidRuntime(14655): FATAL EXCEPTION: AsyncTask #3
07-14 15:22:40.726: E/AndroidRuntime(14655): java.lang.RuntimeException: An error occured while executing doInBackground()
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.lang.Thread.run(Thread.java:1019)
07-14 15:22:40.726: E/AndroidRuntime(14655): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.view.ViewRoot.checkThread(ViewRoot.java:3272)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.view.ViewRoot.invalidateChild(ViewRoot.java:720)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:746)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.view.View.invalidate(View.java:5337)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.widget.TextView.checkForRelayout(TextView.java:5649)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.widget.TextView.setText(TextView.java:2786)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.widget.TextView.setText(TextView.java:2647)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.widget.TextView.setText(TextView.java:2622)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at com.example.airscapefancontroller.MainActivity.resetStats(MainActivity.java:906)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:631)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:1)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-14 15:22:40.726: E/AndroidRuntime(14655):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-14 15:22:40.726: E/AndroidRuntime(14655):    ... 4 more
07-14 15:22:43.082: I/System.out(14655): I-O side Error
07-14 15:22:43.167: W/System.err(14655): org.apache.http.conn.ConnectTimeoutException: Connect to /10.0.0.29:80 timed out
07-14 15:22:43.167: W/System.err(14655):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
07-14 15:22:43.167: W/System.err(14655):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:159)
07-14 15:22:43.167: W/System.err(14655):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-14 15:22:43.171: W/System.err(14655):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-14 15:22:43.171: W/System.err(14655):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
07-14 15:22:43.171: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-14 15:22:43.171: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-14 15:22:43.171: W/System.err(14655):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-14 15:22:43.171: W/System.err(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:608)
07-14 15:22:43.171: W/System.err(14655):    at com.example.airscapefancontroller.MainActivity$RequestTask.doInBackground(MainActivity.java:1)
07-14 15:22:43.171: W/System.err(14655):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-14 15:22:43.171: W/System.err(14655):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-14 15:22:43.171: W/System.err(14655):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-14 15:22:43.171: W/System.err(14655):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-14 15:22:43.171: W/System.err(14655):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-14 15:22:43.171: W/System.err(14655):    at java.lang.Thread.run(Thread.java:1019)
07-14 15:22:43.175: W/dalvikvm(14655): threadid=10: thread exiting with uncaught exception     (group=0x40015578)
考虑到doinbackground我认为它的引用试图连接到不再活动的url,这是有意义的。它是有效的,因此它将通过所有有效性检查,但不会返回任何有用的内容

以下是doinbackground:

@Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                resetStats();
                stopRefreshService();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            System.out.println("Client Side Error");
            e.printStackTrace();
            resetStats();
            stopRefreshService();
            return null;
        } catch (IOException e) {
            System.out.println("I-O side Error");
            e.printStackTrace();
            resetStats();
            stopRefreshService();
            return null;
        } 
        return responseString;
    }
下面是启动东西的按钮单击方法

    public void controlClick(View v){

    if(actionIpSet()){
        //This starts the service that runs every 30 secs for 2 minutes the same code found in the do in backgroun.
        startRefreshService();
        switch (v.getId()) {
            case R.id.imageButton1: 
                  new RequestTask().execute("http://"+ actionIP + "/fanspd.cgi?dir=1");
                  break;

            case R.id.imageButton2:
                new RequestTask().execute("http://"+ actionIP +"/fanspd.cgi?dir=2");
                break;

            case R.id.imageButton3:
                new RequestTask().execute("http://"+ actionIP +"/fanspd.cgi?dir=3");
                break;

            case R.id.imageButton4:
                new RequestTask().execute("http://"+ actionIP +"/fanspd.cgi?dir=4");
                break;

            case R.id.Button02:
                Refresh();
                break;
        }
    }else{
        System.out.println("ActionIP is not set: " + actionIP);
    }

我回答了我自己的问题。正如您可能在上面的doinbackground代码中看到的,有以下方法resetStats的3个实例

在以下所有错误情况下都可以找到:

 } else{
            //Closes the connection.
            response.getEntity().getContent().close();
            //error case 1
            resetStats();
            stopRefreshService();
            throw new IOException(statusLine.getReasonPhrase());
        }
    } catch (ClientProtocolException e) {
        System.out.println("Client Side Error");
        e.printStackTrace();
        //error case 2
        resetStats();
        stopRefreshService();
        return null;
    } catch (IOException e) {
        System.out.println("I-O side Error");
        e.printStackTrace();
        //error case 3
        resetStats();
        stopRefreshService();
        return null;
    } 
方法太长,没有必要在答案中张贴。基本上,它之所以会导致问题,是因为它是一种试图在UI线程上运行的方法。这是不可能的,将导致你的应用程序崩溃。我完全忘了。此方法在单独的线程和2上运行。试图在后台运行它会导致这样的麻烦


我要感谢Greenapps对我的问题做出的回应。我还要感谢greater SO社区来到这里并回答问题

您没有发布足够的日志行。如果url无效,您将得到一个非常好的描述异常。对此表示抱歉。我在之前和之后都能看到,这个异常被很好地捕捉到,它是黄色的,不会导致我的应用程序崩溃。我也可以把其中的一些放到一分钟内。我刚刚添加了完整的错误日志。我把问题缩小了一点。我现在怀疑这不是因为服务,而是因为doinbackground异步任务。我已禁用所有服务,并在服务未运行的情况下收到相同的错误。我只是回答了这个问题,但没有足够的可信度发布我的回答。基本上我是想把东西从doinbackground发布到UI线程。哎呀!好的,谢谢社区的帮助!您有一个ConnectTimeoutException。日志中清楚地提到了。主要活动第1行和第608行。哪一行代码?10.0.0.29的ip地址是?请告知您是否使用设备或模拟器。还是你已经解决了这个问题?那就清楚了。