Possible Duplicate:
Force close using sockets and AsyncTask
Hi people of stack….
Please please please help me, I am losing my mind.
Please see code and logcat…..
Basically what the code is doing is:
- Taking an IP Address from an intent.
- Connecting to the IP with port 32
- Then send a command, wait for response and the send another command.
- After the 2 commands our sent I should get a response of “SNX_COM>”
- Once the connection is established, I want the connection to stay open to send specific commands on button click.
^^That’s basically what my code should achieve ^^
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
This happens when you swallow exceptions… You have a NPE at one of these line (it can’t be said which one because you pasted both on the same line 71):
socketis an instance variable ofIPControl(just likeinandout) and this means that if for whatever reason the connection can’t be estabilished, the program just prints the stack trace and continue:If you examine your console carefully (or maybe the Eclipse console) you’ll find exactly what happens, and thus what you can do to fix the actual problem.
However you should really put all of your code inside the first
tryblock, because it doesn’t make any sense to continue if the connection cannot be estabilished.Also,
socket,inandoutshould not need to be instance variable – we can’t give further advices because you provided no context – however since these are not reused in the rest of the Activity’s code, you can freely make them local variables. Finally, it’s good practice toclose()everything when you’re done (that’s another reason not to use instance variables).