Как вы называете веб-сервис в Android таким образом, чтобы он продолжал ждать ответа, даже если активность находится в фоновом режиме? - PullRequest
1 голос
/ 26 сентября 2011

Какой подход я должен использовать, если мне нужно подключиться к веб-службе и убедиться, что она продолжит загрузку, даже после того, как экран повернут, или неожиданно появится телефонный звонок, или действие будет переведено в фоновый режим?

Я прочитал некоторые ответы здесь, что вы используете AsyncTask или Сервис для подключения к веб-сервису.Это действительно правильный подход при подключении к веб-сервису?Каков наиболее предлагаемый подход и обычно используемый подход?Буду признателен, если вы также дадите мне некоторые пояснения и примеры кодов, касающиеся подхода, который вы будете предлагать.

1 Ответ

3 голосов
/ 26 сентября 2011

Это действительно зависит от ваших требований:

Служба
Если ваш запрос занимает много времени и ваша заявка сильно зависит от результата (постоянные данные) Iпредложил бы использовать службу, потому что система Android может решить убрать приложение, которое было перенесено в фоновый режим, и ваш запрос будет просто пропущен.данные, которые нужны вашему приложению только для текущего состояния (данные, которые могут быть выброшены после закрытия реального приложения), я бы использовал AsyncTask.Это может быть очень сложно обработать, когда происходят изменения ориентации, поэтому я привожу пример ( note - это план, чтобы получить идею, а не окончательное решение).мое приложение и моя AsyncTask убиты?
Когда вы толкаете свое приложение в фоновый режим, оно все еще остается активным.Если вы используете другое приложение и этот запрос требует больше памяти, система Android может решить убить ваше активное приложение, чтобы освободить необходимые ресурсы.С этого момента ваша деятельность и ваша задача ушли.Но у задачи все еще есть шанс завершить и сохранить результаты в базе данных или на SD-карте.

public class YourActivity extends Activity {

    private MyReqeustTask mRequestTask;

    public void onCreate(Bundle state) {
         // your activity setup

         // get your running task after orientation change
         mRequestTask = (MyRequestTask) getLastNonConfigurationInstance();

         if (mRequestTask != null) {
             mRequestTask.mActivity = new WeakReference<MyActivity>(this);
             processRequest();
         }
    }

    // call that somewhere - decide what implementation pattern you choose
    // if you need more than a single request - be inventive ;-)
    public startRequest() {
        mRequestTask = new MyRequestTask();
        mRequestTask.mActivity = new WeakReference<MyActivity>(this);
        mRequestTaks.execute(your, params);
    }

    // this is a request to process the result form your actual request
    // if it's still running, nothing happens
    public processResult() {
        if (mRequestTask == null || mRequest.getStatus() != Status.FINISHED) {
            return;
        }

        Result result = mRequest.getResult();
        // update and set whatever you want here
        mRequestTask = null;
    }

    public Object onRetainNonConfigurationInstance() {
        // retain task to get it back after orientation change
        return mRequestTask;
    }

    private static MyRequestTaks extends AsyncTask<Params, Progress, Result> {

        WeakReference<MyActivity> mActivity;

        protected Result doInBackground(Params... params) {
            // do your request here
            // don't ever youe mActivity in here, publish updates instead!
            // return your final result at the end
        }

        protected void onProgressUpdate(Progress... progress) {
            MyActivity activity = mActivity.get();

            if (activity != null) {
                // do whatever your want to inform activity about undates
            }
        }

        protected void onPostExecute(Result result) {
            MyActivity activity = mActivity.get();

            if (activity != null) {
                // this will update your activity even if it is paused
                activity.processRequest();
            }
        }
    }
}
...