Android在发送URL字符串之前确保LAN上的URL处于活动状态
我的应用程序通过http通过wifi将通信从android设备发送到路由器,并最终到达设备。此字符串完全取决于LAN上设备的ip地址 字符串如下所示: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://*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地址是?请告知您是否使用设备或模拟器。还是你已经解决了这个问题?那就清楚了。