AndroidクライアントでTCPクライアントを実行しています。これは、Windowsアプリケーションからデータを送受信します。メッセージを受け取ったら、それを解析してイメージを表示しようとします。私はこのWindowsアプリから新しいメッセージをチェックし続ける必要があります。Android phoneのTCPクライアント:サーバから受信したメッセージに基づいて画像を表示し続けます。
クライアントスレッドは実行を継続します。メッセージが受信されると、それをメインアクティビティに渡して解析しますが、イメージを表示することはできません。私は100ミリ秒ごとにクライアントが新しいメッセージをチェックするようにしたい。現時点では、スレッドが実行され続けるとLogCatが氾濫し、LogCatの内容を実際に見ることができません。
基本的には、新しいメッセージがあるときに新しいメッセージをチェックし、メインのアクティビティに渡してパースしてイメージを表示するように、クライアントを実行します。下記のコードを読んで、必要に応じて修正やより良いアプローチを提案してください。
クライアントコードは以下のとおりです。
主な活動:
public class TCPListen extends Activity implements TCPListener {
private TextView mTitle;
public String data[] = new String[2];
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
// Set up the window layout
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
// Set up the custom title
mTitle = (TextView) findViewById(R.id.title_left_text);
mTitle.setText(R.string.app_name);
mTitle = (TextView) findViewById(R.id.title_right_text);
//TcpServiceHandler handler=new TcpServiceHandler(this);
//handler.execute("192.168.62.23");
TcpServiceHandler handler = new TcpServiceHandler(this,this);
Thread th = new Thread(handler);
th.start();
}
public String[] callCompleted(String source){
Log.d("TCP", "Std parser " + source);
mTitle.setText(source);
//String data[] = new String[2];
//if (source.matches("<MSG><N>.*</N><V>.*</V></MSG>")) {
Document doc = null;
try{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = (Document) db.parse(new ByteArrayInputStream(source.getBytes()));
NodeList n = doc.getElementsByTagName("N");
Node nd = n.item(0);
String msgName = nd.getFirstChild().getNodeValue();
NodeList n1 = doc.getElementsByTagName("V");
Node nd1 = n1.item(0);
String tmpVal = nd1.getFirstChild().getNodeValue();
data[0] = msgName;
data[1] = tmpVal;
Log.d("TCP", "Inside Std parser " + data[0] + " " + data[1]);
actionOnData(data[0], data[1]);
}
catch(Exception e){
e.printStackTrace();
}
Log.d("TCP", "Just outside Std parser " + data[0] + " " + data[1]);
return data;
//} else Log.d("TCP", "Message in wrong format " + source);
//mTitle.setText("Message in wrong format " + source);
//return data;
}
//Function to display driver messages/images based on individual messages
public void actionOnData(String name, String value) {
String tempName = name;
String tempVal = value;
//while (true) {
if(tempName.equals("shiftDirection") && tempVal.equals("1")) {
Log.d("TCP","in actionOnData " + data[0] + " " + data[1]);
mTitle.setText("Change to next higher gear");
Intent myIntent = new Intent();
myIntent.setClassName("com.example.android.TCPListen", "com.example.android.TCPListen.Images");
//myIntent.putExtra("Change gear", "Shift to next gear!"); // key/value pair, where key needs current package prefix.
startActivity(myIntent);
try {
wait(3000);
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
} else if(tempName.equals("vehicleSpeed") && tempVal.equals("120")) {
Log.d("TCP","in actionOnData " + data[0] + " " + data[1]);
mTitle.setText("Drive like a man");
//Intent myIntent = new Intent();
//myIntent.setClassName("com.example.android.TCPListen", "com.example.android.TCPListen.Images");
////myIntent.putExtra("Change gear", "Shift to next gear!"); // key/value pair, where key needs current package prefix.
//startActivity(myIntent);
} else Log.d("TCP", "Just show an image");
//}
}
}
はインタフェース:
public interface TCPListener {
public String[] callCompleted(String msg);
}
スレッド:あなたはより良いアプローチのための提案を求めているので
public class TcpServiceHandler implements Runnable {
TCPListener _listener;
private Activity _act;
public TcpServiceHandler(TCPListener listener, Activity act){
_listener = listener;
_act = act;
}
public synchronized void run() {
// TODO Auto-generated method stub
//if(socket==null){
try {
//InetAddress serverAddr = InetAddress.getByName("192.168.178.25");
Socket socket = new Socket("192.168.2.103", 1200, true);
//
while(true){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final String str = in.readLine();
this._act.runOnUiThread(new Runnable(){
public void run() {
_listener.callCompleted(str);
}
});
}
catch(Exception e){
e.printStackTrace();
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}