java - Android长轮询技术

标签 java android long-polling

我有一些简单的问题。
我可以仅使用 AsyncTask 在 java 上进行长轮询吗?

class makepolling extends AsyncTask<String, String, String> {

    String TAG = "AndroidPolling";
    int CONNECTION_TIMEOUT = 900000;
    int mHeartbeat = 10000;
    int TIMEOUT_TOLERANCE = 5000;
    String mPushURL = "https://my_serv_adress/service";

    @Override
    protected String doInBackground(String... arg0) {
        String result = null;
        DefaultHttpClient def = new DefaultHttpClient();
        HttpParams httpParams = def.getParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT);

        ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
        HttpPost httpPost = new HttpPost(mPushURL);
        httpPost.addHeader("Accept", "application/json");

        try {
            Log.i(TAG, "Executing POST(PUSH) request " + httpPost.getRequestLine());

            HttpResponse httpResponse = def.execute(httpPost);
            Log.i(TAG, result);
            Log.i(TAG, String.valueOf(httpResponse.getProtocolVersion()));
            Log.i(TAG, String.valueOf(httpResponse.getEntity().getContent())); //For testing purposes


        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;

    }

当响应返回超时时,我如何再次发出请求?
此致。 抱歉我的英语不好

最佳答案

AsyncTasks 用于相对较短的操作,因此如果您想要进行一些长轮询,您可能应该尝试不同的方法。如果您想定期进行网络调用,您可以在后台运行一个 Service

下面的代码可能对您有帮助。它只是每 10 秒执行一次的服务模板。请记住,网络调用需要在 UI 线程之外完成:

public class MyService extends Service {

        private IBinder mBinder = new SocketServerBinder();
        private Timer mTimer;
        private boolean mRunning = false;

        @Override
        public void onCreate() {
                super.onCreate();
                mTimer = new Timer();
                mTimer.schedule(new TimerTask() {

                        @Override
                        public void run() {

                                if (mRunning) {
                                        // make your network call here
                                }
                        }
                }, 10000, 10000);
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                mRunning = true;
                return super.onStartCommand(intent, flags, startId);
        }

        @Override
        public IBinder onBind(Intent arg0) {
                mRunning = true;
                return mBinder;
        }

        @Override
        public boolean onUnbind(Intent intent) {
                mRunning = false;
                return super.onUnbind(intent);
        }

        public class SocketServerBinder extends Binder {

                public MyService getService() {
                        return MyService.this;
                }

        }

}

关于java - Android长轮询技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20800189/

相关文章:

java - 如何使用 Struts 2 在 Java 中实现长轮询?

Java Swing 面包屑组件?

java - 事务的传播行为

Android - 无法打开内容 : file:///storage/emulated/0

android - 如何从 Android 中的经纬度列表创建 Mapbox 热点和热图?

api - 使用 Symfony 实现长轮询 API

java - 动态贾斯珀 : 3 report sections in one page

java - 需要正则表达式来格式化 php 中的文件

Android - 禁用密码提示

java - 将线程保持在 Spring 休息请求中以进行长轮询