喜欢堆叠的人......
请请帮助我,我正在失去理智。
请参阅代码和logcat .....
基本上代码的作用是:
^^这基本上是我的代码应该实现的目标^^
Java Class
package com.smarte.smartipcontrol;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
public class IPControl extends Activity {
private Socket socket;
private String serverIpAddress = "com.smarte.smartipcontrol.ACTU_IP";
private static final int REDIRECTED_SERVERPORT = 32;
public PrintWriter out;
public BufferedReader in;
public String data;
public Object pd;
public void getModel(View view) {
try {
out.println("[m\r\n");
//System.out.print("root\r\n");
while(!in.ready());
String textStatus = readBuffer();
} catch(IOException e) {}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_ipcontrol);
try{
new AsyncAction().execute();
}catch (Exception e) {
e.printStackTrace();
}
}
private class AsyncAction extends AsyncTask<String, Void, String> {
protected String doInBackground(String... args) {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (! in .ready());
readBuffer();
out.println("root\r\n");
//System.out.print("root\r\n");
while (! in .ready());
readBuffer();
out.println("root\r\n");
//System.out.print("root\r\n");
while (! in .ready());
String msg = "";
while ( in .ready()) {
msg = msg + (char) in .read();
}
} catch (IOException e) {}
return null;//returns what you want to pass to the onPostExecute()
}
protected void onPostExecute(String result) {
//results the data returned from doInbackground
IPControl.this.data = result;
}
}
private String readBuffer() throws IOException {
String msg = "";
while(in.ready()) {
msg = msg + (char)in.read();
}
//System.out.print(msg);
if(msg.indexOf("SNX_COM> ") != -1) return msg.substring(0, msg.indexOf("SNX_COM> "));
else return msg;
}
}
... logcat中
12-03 21:56:43.670: E/AndroidRuntime(1231): FATAL EXCEPTION: AsyncTask #1
12-03 21:56:43.670: E/AndroidRuntime(1231): java.lang.RuntimeException: An error occured while executing doInBackground()
12-03 21:56:43.670: E/AndroidRuntime(1231): at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
12-03 21:56:43.670: E/AndroidRuntime(1231): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.lang.Thread.run(Thread.java:856)
12-03 21:56:43.670: E/AndroidRuntime(1231): Caused by: java.lang.NullPointerException
12-03 21:56:43.670: E/AndroidRuntime(1231): at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:71)
12-03 21:56:43.670: E/AndroidRuntime(1231): at com.smarte.smartipcontrol.IPControl$AsyncAction.doInBackground(IPControl.java:1)
12-03 21:56:43.670: E/AndroidRuntime(1231): at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-03 21:56:43.670: E/AndroidRuntime(1231): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
12-03 21:56:43.670: E/AndroidRuntime(1231): ... 4 more
答案 0 :(得分:1)
当您吞下异常时会发生这种情况......您在其中一条线路上有一个NPE(不能说是哪一条,因为您在同一条线路上粘贴了一条线路71):
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socket
是IPControl
的实例变量(就像in
和out
),这意味着如果由于某种原因无法建立连接,程序只打印堆栈跟踪并继续:
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
} catch (UnknownHostException e) {
e.printStackTrace();
}
// next of the code
如果你仔细检查你的控制台(或者可能是Eclipse控制台),你会发现到底发生了什么,以及你可以做些什么来解决实际问题。
但是,您应该将所有代码放在第一个try
块中,因为如果无法建立连接,则继续没有任何意义。
此外,socket
,in
和out
不应该是实例变量 - 我们无法提供进一步的建议,因为您没有提供上下文 - 但是因为这些不会在在Activity的其余代码中,您可以自由地使它们成为局部变量。最后,当你完成时close()
一切都是好的做法(这是不使用实例变量的另一个原因)。