我的应用程序通过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);
}
答案 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社区来到这里并回答问题。