2 questions regarding socket programming with Android
<p>I've taken examples I've found on the internet for socket programming, and am trying to build my own Android client for a an Ethernet-enabled Arduino server. I have 2 problems however.
First, the code for my main activity:</p>

<pre><code>package com.domiflichi.TesterProject;

import java.io.BufferedWriter; // output
import java.io.BufferedReader; // input
import java.io.InputStreamReader; // input
import java.io.OutputStreamWriter; // output
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;







public class TesterProjectMain extends Activity implements OnClickListener
{

private Button connectPhones;

private TextView myTextView; // represents the 'status text'

private String serverIpAddress = "";

private boolean connected = false;


private Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.client);


connectPhones = (Button) findViewById(R.id.connect_phones);

connectPhones.setOnClickListener(connectListener);
connectPhones.setOnClickListener(this);



myTextView = (TextView) findViewById(R.id.text1);

}



// This was created when using the 'implements OnClickListener' in the class
public void onClick(View v) {
if (v.getId() == R.id.connect_phones) {
if (!connected) {
serverIpAddress = "192.168.0.178";
if (!serverIpAddress.equals("")) {
Thread cThread = new Thread(new ClientThread());
cThread.start();
connectPhones.setEnabled(false); // Once the button is pressed, disable it. :)
}
}

} else if (v.getId() == R.id.status_req) {
// CODE HERE FOR STATUS REQUEST BUTTON?

} else if (v.getId() == R.id.cmd_toggle) {
// CODE HERE FOR TOGGLE DOOR BUTTON?

} else if (v.getId() == R.id.cmd_crack) {
// CODE HERE FOR CRACK BUTTON?

} else if (v.getId() == R.id.disconnect) {
// CODE HERE FOR DISCONNECT BUTTON?

}
}





public class ClientThread implements Runnable {

public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "C: Connecting...");
Socket socket = new Socket(serverAddr, 23);
connected = true;

while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println("mypass*");
Log.d("ClientActivity", "C: Sent.");





BufferedReader r = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line);
Log.d("Server response", line.toString());

}





handler.post(new Runnable() {
public void run() {


if (total.toString().contentEquals("status:open")) {

myTextView.setText(R.string.status_open);
} else {
myTextView.setText(R.string.status_closed);
}

}
});







connected = false;

} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}

}


socket.close();
Log.d("ClientActivity", "C: Closed.");


} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
}
}
}
</code></pre>

<p>So my 2 questions are:</p>

<ol>
<li><p>I have no idea how to get my buttons to interact with the socket where I send commands to my server. After I connect, I have (4) buttons that need to send various commands through the socket (which is running in a separate thread that was kicked off by clicking on the 'connect' button I have). (Look for the '// CODE HERE FOR STATUS REQUEST BUTTON?' comments for where I was expecting to put the code for the various buttons)</p></li>
<li><p>I need to move the</p>

<p>'handler.post(new Runnable() {'</p></li>
</ol>

<p>block of code into my main loop:</p>

<pre><code>(while ((line = r.readLine()) != null) {
total.append(line);
Log.d("Server response", line.toString());
}
</code></pre>

<p>However, when I do that, and change:</p>

<pre><code>if (total.toString().contentEquals("status:open")) {
</code></pre>

<p>to</p>

<pre><code>if (line.toString().contentEquals("status:open")) {
</code></pre>

<p>(because I want to actually only read one line at a time),
Eclipse complains with the following message:
Cannot refer to a non-final variable line inside an inner class defined in a different method</p>

<p>And if I try to change the line above that...:
    String line;
to
    static String line;</p>

<p>Eclipse complains on the next line:</p>

<p>while ((line = r.readLine()) != null) {</p>

<p>saying:
The final local variable line may already have been assigned</p>

<p>I can't even believe I've gotten this far as I'm a complete newbie, but now I've hit a wall.</p>
