Длинный опрос технологии Android

У меня есть простой вопрос.
Могу ли я сделать длинный опрос на Java, используя только AsyncTask?

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;

    }

когда ответ возвращать ВРЕМЯ, как я делаю запрос снова?
С наилучшими пожеланиями. Извините за мой плохой английский

2 ответа

AsyncTasks предназначены для использования при относительно коротких операциях, поэтому, если вы хотите провести длительный опрос, вам, вероятно, следует попробовать другой подход. Если вы хотите периодически совершать сетевые вызовы, вы можете иметь Service работает в фоновом режиме.

Следующий код может помочь вам. Это просто шаблон Сервиса, который запускается каждые 10 секунд. Помните, что сетевой вызов должен выполняться из потока пользовательского интерфейса:

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;
                }

        }

}

Вы можете сделать функцию через некоторое время, которая возвращает время или ваш ответ

 @Override
    protected String doInBackground(String... arg0) {
     String result= TIME_OUT;   //public static final String TIME_OUT = time_out_error" 
     while(result.equals(TIME_OUT))
         result = getServerInformation();

     return result;
    }




public String  getServerInformation(){
         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();
        }
//HERE YOU SHOULD TURN result = TIME_OUT or whatever you want
        return result;

  }
Другие вопросы по тегам