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

时间:2014-07-14 20:07:40

标签: android

我的应用程序通过http从wifi设备向路由器发送通过http的通信,最终到达设备。该字符串完全取决于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);
    }

1 个答案:

答案 0 :(得分:0)

我回答了自己的问题。您可以在上面的doinbackground代码中看到以下方法的3个实例 resetStats();

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

 } 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线程上运行的方法。 这是不可能的,会导致您的应用崩溃。我完全忘记了1.此方法是在一个单独的线程上运行而2.尝试从后台运行它会导致此类问题。

我要感谢Greenapps回答我的问题。我还要感谢更大的SO社区来到这里并回答问题。