我写了一个客户端(android智能手机)-server(java)-program。
它仅用于练习,直到现在我只是将一个字符串发送到服务器,将其保存到文件中。
目前我想实现一项新功能,每隔5分钟将我的gps坐标发送到我的服务器并保存。
为此,我设置AlarmManager
每300000毫秒(或5分钟)接收广播。
收到广播后,我想与我的服务器建立连接:
AlarmReceiver.class:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("alarmReceiver","received alarm");
MainActivity activity = (MainActivity) context;
activity.cConnect = new ConnectionThread(activity.clientServer, activity.out);
activity.cConnect.start();
}
}
ConnectionThread.class:
public class ConnectionThread extends Thread {
Socket clientServer;
BufferedWriter out;
public ConnectionThread(Socket clientServer_, BufferedWriter out_) {
// TODO Auto-generated constructor stub
this.clientServer = clientServer_;
this.out = out_;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
clientServer = new Socket(MainActivity.dstName, MainActivity.dstPort);
out = new BufferedWriter(new OutputStreamWriter(clientServer.getOutputStream()));
out.write("alarm received"); //currently just sending this string
out.flush();
out.close();
clientServer.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在我的 MainActivity.class 中,我声明了以下内容:
protected static String dstName = ...
protected static int dstPort = ...
public Socket clientServer;
public BufferedWriter out;
private AlarmManager alarmMgr;
private static int repeatAlarmEvery = 30000;
private static int firstAlarmAfter = repeatAlarmEvery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);...
我的问题是,我担心我在AlarmReceiver
接收广播并且已经在同一端口建立连接时尝试传输文本。所以我决定只有一个{{1这样我可以检查socket-object called clientServer
- > clientServer != null
。
但是试图在我的模拟器上运行我的客户端程序我遇到了以下错误:
do not establish a new connection, instead use the existing one
我认为/看到的是广播收到的上下文受到限制,我不能将其投射到我的活动06-03 19:24:29.969: E/AndroidRuntime(2186): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext cannot be cast to com.example.clientservercommunication.MainActivity
06-03 19:24:29.969: E/AndroidRuntime(2186): at com.example.clientservercommunication.AlarmReceiver.onReceive(AlarmReceiver.java:14)
。因此,我无法从MainActivity
访问clientSocket
和out
。
现在我有两个解决方案:
1)声明MainActivity.class
和clientSocket
静态。
2)为文本传输建立不同的连接(不同的端口),避免传输文本和gps坐标之间的冲突。例如文本传输端口50000,gps数据在端口50001上传输
问题:
哪一个更好(关于内存泄漏,如果可能有任何等等,不是关于意见,例如因为我更喜欢解决方案等等。)/更常见的方法还是有更好的设计模式/解决方案,以实现我想要的。
对我来说,获得正确模式的支持是非常重要的,因为我厌倦了在没有足够背景知识的情况下尝试它来解决大量问题。希望我能很好地描述我的问题。