Как вернуть значение из вспомогательного класса с помощью AsyncTask - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь создать вспомогательный класс, который реализует методы с использованием AsyncTask.

public interface ResultCallback
{
    public String processResult();
}

public class ServerAdapter
{

    // Required processResult to call this method. Kind of lousy but I do not know
    // how to throw exception from onPostExcecute in AsyncTask.
    public String getResult() throws AirplaneModeException, NoNetworkException
    {
       // code to get return value from Dowork throw exceptions on errors
    }

    public void getLicense(ResultCallback licenseCallback)
    {
        ...// Set url, outmessage
        new Dowork(url, outMessage, licenseCallback).execute();
    }

    public void queryServer(int queryId, ArrayList<String> args, ResultCallback queryCallback)
    {
        ...// Set url, outmessage
        new Dowork(url, outmessage, queryCallback);
    }

    private class Dowork extends AsyncTask<Void, Void, String>
    {
        ...
        private ResultCallback rc;

        public Dowork(String url, String outMessage, ResultCallback rc)
        {
            // code here
        }

        protected String doInBackground(Void... params)
        {
            try
            {
                 // code here
            }
            catch (AirplaneModeException e)
            {
                return "AirplaneModeException";
            }
            catch ...
         }

         protected void onPostExecute(String result)
         {
             this.result = result;
             cb.processResult();
         }
    }
}

// Client class
public class myclass extends Activity
{
    MyServerAdapter myAdapter;

    public void onCreate(Bundle savedInstanceState)
    {
        ...
        myAdapter = new ServerAdapter();
        myAdapter.getLicence(new MyLicenseCallback);
        myAdapter.queryServer(id, args, new MyQueryCallback);
        ...
    }

    public class MyLicenseCallback extends ResultCallback implements processResult
    {
        try
        {
            String result = myAdapter.getResult;
            ...
        }
        catch
        ... 
    }
    ...

}

Я новичок в Java и Android и у меня есть пара вопросов:

1- Будет ли несколько вызовов метода ServerAdapter вызывать проблему синхронизации? Например, когда выполняется код для обратного вызова MyLicense, если onPostExecute вызывает MyQueryCallback, должен ли я обрабатывать его или Java обрабатывает его?

2- Как получить исключение, выданное в Dowork, в обратный вызов вместо обхода, как в коде выше?

Ответы [ 2 ]

1 голос
/ 11 мая 2011
  1. Android гарантирует, что методы в вашей деятельности и AsyncTask.onPostExecute работают в одном и том же основном потоке пользовательского интерфейса.

  2. Вы можете сохранить исключение в переменной экземпляра задачи так же, как и для результата (верните, скажем, null как результат в этом случае). Проверьте, есть ли исключение или нет позже, чтобы обработать ситуацию ошибки.

0 голосов
/ 07 октября 2011

только для турецких ораторов :( http://aaarkonusurum.blogspot.com/2011/10/asynctask-classtan-donen-parametreyi.html

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