Как и где вызывать мою задачу при расширении AsyncTask - PullRequest
1 голос
/ 13 февраля 2012

У меня проблемы с пониманием AsyncTask, даже после прочтения всего о нем в Developer.Android.Я ищу некоторое понимание того, как мне следует поступить.Это ситуация:

У меня есть Activity, которая при событии onClick вызывает метод LoginCheck () базового класса LoginController.Затем класс LoginController продолжает извлекать любую необходимую информацию из класса UserInfo или из Activity (User и Password) и создает экземпляр RestClient, который затем выполняет вызов веб-службы и пытается войти в систему. RestClient имеет приватныйКласс CallServiceTask, который расширяет AsyncTask.

У меня есть несколько проблем с дизайном, которые, я надеюсь, вам пригодятся.

  • Я правильно делаю?Это правильный способ убедиться, что любые вызовы веб-службы выполняются асинхронно?
  • Как использовать onProgressUpdate или что-то еще, чтобы уведомить пользователя о том, что приложение находится в процессе входа в систему?
  • Как мне получить данные, сохраненные в DoinBackground ()?

Ниже вы найдете фрагменты рассматриваемого проекта:

RestClient

// From the constructor...
rtnData = new Object[]{ new JSONObject() , Boolean.TRUE  };

   public void ExecuteCall(RequestMethod method) throws Exception
{
    Object[] parameters = new Object[]{ new HttpGet() , new String("") };
    switch(method) {
        case GET:
        {
            //add parameters
            String combinedParams = "";
            if(!params.isEmpty()){
                combinedParams += "?";
                for(NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue());
                    if(combinedParams.length() > 1)
                    {
                        combinedParams  +=  "&" + paramString;
                    }
                    else
                    {
                        combinedParams += paramString;
                    }
                }
            }

            HttpGet request = new HttpGet(url + combinedParams);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }
            parameters[0] = request;
            parameters[1] = url;

            new CallServiceTask().execute(request, url);


            jsonData = ((JSONObject) rtnData[0]).optJSONObject("data");
            connError = (Boolean) rtnData[1];
            break;

        }
        case POST: ....

    }
}

private Object[] executeRequest(HttpUriRequest request, String url)
{
    HttpClient client = new DefaultHttpClient();
    client = getNewHttpClient();

    HttpResponse httpResponse;

    try {
        httpResponse = client.execute(request);
        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            String response = convertStreamToString(instream);
            try {
                rtnData[0] = new JSONObject(response);
                rtnData[1] = false;

            } catch (JSONException e1) {
                rtnData[1] = true;
                e1.printStackTrace();
            }

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return rtnData;
}

CallServiceTask

    private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{

    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];

        return executeRequest(req, url);
    }

    @Override
    protected void onPostExecute(Object[] result) 
    {
             rtnData = result;
    }
}

1 Ответ

2 голосов
/ 13 февраля 2012

Совершенно верно, что любые, возможно, длительные операции должны выполняться в отдельных потоках. И AsyncTask - хороший способ решения подобных проблем, поскольку он также дает вам простой способ синхронизировать вашу задачу с потоком пользовательского интерфейса. Это ответ на ваш первый вопрос.

Теперь по поводу обновления потока пользовательского интерфейса, чтобы показать вашим пользователям, что ваше приложение не застряло. Поскольку методы AsyncTask onPreExecute() и onPostExecute() работают внутри потока пользовательского интерфейса, вы можете легко создавать, запускать и останавливать ProgressDialog с или ProgressBar с. Если вы хотите показать текущий ход выполнения задачи, вы должны вызвать метод publishProgress(int) внутри doInBackground(), а затем использовать его внутри AsyncTask s onProgressUpdate() метода. Там вы можете, например, обновить свой ProgressDialog.

А чтобы получить результат из AsyncTask, вы можете либо вызвать его метод get() (это синхронный вызов), либо внедрить некоторый интерфейс обратного вызова, который сообщит активности о завершении задачи.

Я надеюсь, что ответ достаточно ясен, если нет - не стесняйтесь задавать больше вопросов. Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Создайте интерфейс с именем, например, onFetchFinishedListener с одним методом - void onFetchFinished(String). Ваша деятельность, которая запускает AsyncTask, должна реализовывать этот интерфейс. Теперь создайте конструктор внутри вашего AsyncTask, который принимает объект OnFetchFinishedListener в качестве аргумента, и при создании экземпляра AsyncTask внутри вашей деятельности отправьте ссылку на Activity в качестве аргумента (поскольку он реализует OnFetchFinishedListener). Затем, когда ваша задача будет завершена внутри doInBackground(), вызовите onFetchFinished() на мероприятии. Теперь внутри onFetchFinished(String) метода вашего Activity вы можете использовать String (или другой объект), который вызывается с обратным вызовом. Опять же, надеюсь, я был достаточно ясен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...