需求:实现客户端不断与服务器交互获得实时数据实现:我在后台Service中采用TimerTask类每隔一段时间就去服务器请求数据,请求那块用HttpClient,但发现这样不但应用的响应速度慢,而且应用运行一段时间后就会出现ConnectError的错误,出现错误之后,应用就不再向服务器请求数据。思考:百度查到还可以用Socket和WebService
但是Socket涉及到服务器数据库的安全问题
WebService只写过客户端没写过服务器哪种方式比较好,求大神赐教服务器Android交互 

解决方案 »

  1.   

    1.你service中去做网络请求是不是异步处理的
    2.你请求网络的时候处理了异常没有
    3.如果以上都做了,那就检查你的TimerTask写对没有,是不是定时执行的。
    你说的抛异常不会再像服务器请求如果有问题的话,基本就出现在上面几点。
    另外webservice的调用并不比HttpClient快。
      

  2.   

    另外你的思路好像有点问题。我做过这样的功能,应该是在主界面中启动一个TimerTask定时器发送一个广播(该定时器在应用程序的一个生命周期内只启动一次),然后广播接收器去开启service,然后网络操作写在服务的onStart方法里面。
    activity中代码//flag用来控制该定时器只启动一次
    if (flag) {
    Intent intent = new Intent(Main.this, AlamrReceiver.class);//AlamrReceiver是个广播接收器
    PendingIntent pi = PendingIntent.getBroadcast(Main.this, 0, intent,0);
    AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),(5 * 60 * 1000), pi);
    flag = false;
    }广播接收器中代码public class AlamrReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    intent.setClass(context, service.class);//service是服务
    context.startService(intent);
    }
    }服务中代码@Override
    public void onStart(Intent intent, int startId) {
    Thread t = new Thread(new updateRunnable(intent));//启动线程做网络操作
    t.start();
    onDestroy();
    super.onStart(intent, startId);
    }注意要在AndroidManifest.xml注册服务和广播
      

  3.   

    我的需求是不但要实现客户端与服务器不断交互,还要实现用户退出应用时,仍能获取服务器实时数据,并且遇到异常信息就报警提示客户这样只能是在service中启动TimerTask了
      

  4.   

    我的blog:http://blog.csdn.net/oweixiao123/article/details/9134837
    关于安卓客户端与服务器交互方式的选择
      

  5.   

    socket有一个开源项目,是用于实时推送的  叫androidpn可以百度看一下,这个能不能满足你的需求,是用一个叫xmpp的协议。另外,你service做那个事情叫轮询,这个是比较浪费资源的,如果你间隔时间很短,那实时性可以高一点,但是很浪费手机资源,如果间隔时间长了,那实时性就不行了。自己看着选择吧,最好不要自己用socket去封装,异常很多,处理起来比较费事儿
      

  6.   

    看了,由于现在项目要的紧,我可能没有办法把原有的http通讯改成socket通讯了,如我之前所说,在后台Service中采用TimerTask类每隔一段时间就去服务器请求数据,请求那块用HttpClient,应用运行一段时间后就会报错,logcat输出日志如下:07-11 17:23:47.085: W/System.err(3526): org.apache.http.conn.ConnectTimeoutException: Connect to /192.168.1.111:9007 timed out
    07-11 17:23:47.085: W/System.err(3526):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
    07-11 17:23:47.085: W/System.err(3526):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
    07-11 17:23:47.085: W/System.err(3526):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    07-11 17:23:47.095: W/System.err(3526):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    07-11 17:23:47.095: W/System.err(3526):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    07-11 17:23:47.095: W/System.err(3526):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    07-11 17:23:47.095: W/System.err(3526):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    07-11 17:23:47.095: W/System.err(3526):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    07-11 17:23:47.095: W/System.err(3526):  at com.hch.util.ConnectServerUtil.functionfornet(ConnectServerUtil.java:122)
    07-11 17:23:47.095: W/System.err(3526):  at com.hch.util.ConnectServerUtil.connect(ConnectServerUtil.java:74)
    07-11 17:23:47.095: W/System.err(3526):  at com.hch.util.ConnectServerUtil.connect(ConnectServerUtil.java:46)
    07-11 17:23:47.095: W/System.err(3526):  at com.hch.service.LocalService.getChuanganqiByuname(LocalService.java:164)
    07-11 17:23:47.095: W/System.err(3526):  at com.hch.service.LocalService$Task.run(LocalService.java:78)
    07-11 17:23:47.095: W/System.err(3526):  at java.util.Timer$TimerImpl.run(Timer.java:284)
    请问该怎么解决?