Вопрос по java, android-asynctask, android – Android AsyncTask и передача объектов

3

Мне нужна помощь по базовой архитектуре моего кода в процессе входа в систему. Я внедряю обработку Async Http, чтобы все работало на ICS.

Цель этого кода - войти в мое приложение.

Login form submit from UI (Login.java) connect to our server and pass username / password via http get XML result parse XML results to array. (ParseXML.java) display result feedback in UI.

Теперь все это сработало в моей программе, однако после попытки тестирования с ICS, которая обеспечивает HTTP-соединения Asyc, я быстро осознал свою проблему и заставил усомниться во всем моем дизайне ...

основной способ, которым это в настоящее время работает:

Login.java:

  class Login {
    ...
    ParseXML myXMLParser = new ParseXML();  
    myXMLParser.doLogin(username, password, Login.this);    

    public doFinished(result) {
      // update UI
    }
    ...
  }

ParseXML.java:

  class ParseXML {
    // class variable to hold login object for async to access
    public Login loginObj;
    ...
    public void doLogin(String _username, String _password, Login _l) {
      loginObj = (Login) _l;
      ...

      // create loginUrl string to run through async
      ...
      new DownloadFilesTask().execute(loginUrl);
    }

    class DownloadFilesTask extends AsyncTask<a, b, c> {
      doInBackground() {
        // do stuff
        // download result of http call
        // parse XML
      }

      onPostExecute(result) {        
        // call the public class variable of login object i have and tell it to update the UI
        // pass back the result array.
        loginObj.doFinished(result);
      }
    }
  }

Меня больше всего беспокоит то, что это плохой дизайн, и я должен просто переместить код соединения XML и http в мой файл Login.java, чтобы он был включен (UI, HTTP, XML Parsing, Asyc).

Particularly i'm concerned with calling back to Login.doFinished() от onPostExecute (). это плохо для памяти? Я обеспокоен тем, что это может привести к тому, что объект ParseXML избежит сбора мусора, поскольку теперь он возвращается к действию входа в систему, которое будет продолжаться, как только пользователь войдет в свою очередь, удерживая ParseXML открытым.

Я пришел из PHP, поэтому я пытался сохранить весь мой анализ XML и обработку HTTP в пределахParseXML & Quot; модуль & Quot; так что я знаю, где искать изменения в этом.

В данный моментParseXML обрабатывает всю работу http, т.е.getUsers, getChannels, addUser, delUser, doLogin и т. д. Но стоит ли пытаться переместить весь код для обработки XML и HTTP-соединений (асинхронных) в пределах соответствующего экрана / действия, чтобы они были автономными?

Я действительно ценю любую помощь в этом

Ваш Ответ

3   ответа
2

DownloadHelper.java

public interface DownloadHelper 
{
   public void OnDownloadFinish(String Response);
   public void OnDownloadFailed(String Response); 
}

Login.java

class Login {

    DownloadHelper helper=new DownloadHelper()
    {
      public void OnDownloadFinish(String Response)
       {
           // update UI

       } 

      public void OnDownloadFailed(String Response)
       {
           //Take Action
       }     
    };  


    new ParseXMLTask(this,helper).execute(username, password);
}

ParseXMLTask.java

class ParseXMLTask extends AsyncTask<Object,Object,Object>
{
    DownloadHelper helper;
    public ParseXMLTask (Context context,DownloadHelper helper)
    {
       this.helper=helper;
    }   
    public void onPreExecute(){}

    public Object DoInBackground(Object object)
    {
       // do stuff
      // download result of http call
     // parse XML
     return parsed response
    }  

   public void onPostExceute(Object object)
    {

       helper.OnDownloadFinish((String)object);
       or
        helper.OnDownloadFailed((String)object);

    }
}
Это кажется хорошим подходом, но разве он все еще не подвержен утечкам памяти?
1

что у вас есть LoginActivity, которое создает ParseXML, который затем имеет LoginObject (вы можете назвать это «LoginCallback») для возврата результата в LoginActivity, который отображает результат. Это должно работать, это шаблон обратного вызова, который часто используется. Обратный вызов обычно определяется как интерфейс, а не класс.

Другой подход заключается в запуске AsyncTask в LoginActivity, который вызывает ParseXML в своем doInBackground и возвращает результат непосредственно в LoginActivity в onPostExecute.

PS: Что касается вашего первого замечания, я также пытался сделать обратный вызов, потому что я был уверен, что это хороший способ сделать это, и я даже пытался реализовать & quot; интерфейс & quot; с моего экрана входа, чтобы сделать это. Ваше предложение вселяет в меня надежду, что это может сработать, поэтому я еще раз рассмотрю это. В настоящее время, хотя мой код просто проходитLogin.this отLogin.java вParseXML. ParseXML>Async затем вызывает публичный метод вLogin сказать "эй, я" сделал ... ". Но, как я уже упоминал, я волнуюсь, что это проблема с памятью, потому что она не может быть собрана GC. но я могу быть совершенно неправ в этом! wired00
Спасибо, Кристина, да, что 2-й пункт, который вы указали, - это то, к чему я стремился в своем посте. Я собираюсь поместить код так, как вы говорите, чтобы он был более инкапсулирован в «Экран входа в систему». учебный класс. wired00
1
I should simply move the XML and http connection code within my Login.java file so its all included (UI, HTTP, XML Parsing, Asyc).

большой проклятый класс содержит все (UI, бизнес-логику и т. Д.).

Исходя из ваших требований, хороший OO deisgn IMO это:

Create interface IBusniessDAO define all method signatures (getUsers, getChannels and etc). Create a POJO (AKA. Plain Old Java Object) class XmlParser implements IBusinessDAO, in this class, write you method implementation normally and do not handle any asynchronous execution here (that is not the job of Business POJO). where and how these methods are intended to be used (synchronously or asynchronously) is determined in the caller class (i.e. Activity). If says in the future, you want to replace XmlParser with JsonParser, simple create JsonParser implements IBusinessDAO and replace XmlParser. AsyncTask always stay with Activity (as an inner class), if an Activity requires network functions, simply initialize you IbusinessDAO object in this Activity and call the network-related method properly in AsyncTask.doInBackground() method, and update the UI stuff managed by this activity directly in AsyncTask.onPostExecute() method.

Посмотрите пример кода, который я написал в этомответ раньше, надеюсь, это поможет.

правильно, большое спасибо за ваш ответ, больше философии дизайна было больше, чем мне было нужно. Перемещение асинхронного кода в мою деятельность и оставление моих объектов dao и dbo на автобусе имеет гораздо больше смысла wired00
... я также читал больше о дизайне с использованием интерфейсов. Таким образом, будет изменен дизайн для использования интерфейса IDAO, чтобы можно было повторно использовать кодер. ура wired00
как я сказал в другой ветке, это большая помощь, я буду исследовать проектирование объектов POJO. Мне понравилась ваша мысль в другой ветке о попытке оставить весь асинхронный код внутри действия, потому что он в основном состоит из 2 задач, выполняющих фоновую задачу, ТО, обновляя ваш интерфейс. и это глупо для меня, чтобы попытаться спрятать свой асинхронный код в psuedo BO, что далееaway из моего интерфейса. Спасибо за большую помощь, приятель wired00
Возможно, POJO не является подходящим термином в этом сценарии, не слишком заботьтесь о самом слове. Это просто обычный Java-класс для изоляции / централизации сетевого кода, очень похожий на то, что вы уже сделали в ParseXML.java. Суть в том, что лучше не выполнять какой-либо асинхронный код или код, связанный с Android, в этом необработанном DAO (AKA. Data Access Object) и оставьте их (например, AsyncTask), оставив их в Activity, как лучший рефакторинг кода с точки зрения ОО.

Похожие вопросы