java - Android AsyncTask 和对象传递

标签 java android android-asynctask

我需要一些有关登录过程代码基本架构的帮助。我正在实现异步 Http 处理以使 ICS 工作。

这段代码的目的是登录我的应用。

  • 从 UI (Login.java) 提交登录表单
  • 连接到我们的服务器并通过http获取XML结果传递用户名/密码
  • 将 XML 结果解析为数组。 (ParseXML.java)
  • 在 UI 中显示结果反馈。

现在这一切都在我的程序中工作,但是在尝试使用强制执行异步 HTTP 连接的 ICS 进行测试后,我很快意识到我的问题并让我怀疑我的整个设计......

目前的基本工作方式:

登录.java:

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

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

解析XML.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 解析、Asyc)。

我特别关心从 onPostExecute() 回调到 Login.doFinished()。这对内存不好吗?我担心这会导致 ParseXML 对象避免垃圾收集,因为它现在返回到登录 Activity ,一旦用户登录并保持 ParseXML 打开,该 Activity 将继续运行。

我有 PHP 背景,所以我一直试图将我所有的 XML 解析和 HTTP 处理保存在 ParseXML“模块”中,以便我知道在哪里寻找对此的更改。

目前 ParseXML 处理所有 http 工作,即 getUsersgetChannelsaddUserdelUserdoLogin 等。但是我是否应该尝试移动所有代码来处理相关屏幕/Activity 中的 XML 和 HTTP 连接(异步),以便它们是独立的?

非常感谢任何帮助

最佳答案

在这种情况下我会使用接口(interface)

DownloadHelper.java

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

登录.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);

    }
}

关于java - Android AsyncTask 和对象传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843389/

相关文章:

java - 如何在涉及 Fragment 的 Android 代码中找到空指针错误

java - 如何异步加载文本到语音

android - 全局 ArrayList 和 AsyncTask 问题

java - 无法在 Android O 中构建 NotificationCompat.Builder

android - 使用 android WorkManager 响应 Native HeadlessJs 任务调用

android - 如何以实际尺寸设置图片壁纸?

java - Android后台任务抛出运行时错误

java.lang.OutOfMemoryError : Java heap space

java - 为什么刷新访问 token 会未经授权?

java - 重置 ContentPane 时,按钮功能不再正常工作 Java swing