【发布时间】:2012-06-04 21:28:54
【问题描述】:
我需要一些关于登录过程代码基本架构的帮助。我正在实现异步 Http 处理以使 ICS 工作正常。
此代码的目标是登录我的应用程序。
- 从 UI (Login.java) 提交登录表单
- 连接到我们的服务器并通过http传递用户名/密码获取XML结果
- 将 XML 结果解析为数组。 (ParseXML.java)
- 在 UI 中显示结果反馈。
现在这一切都在我的程序中运行了,但是在尝试使用强制 Asyc HTTP 连接的 ICS 进行测试后,我很快意识到了我的问题并让我怀疑我的整个设计......
目前工作的基本方式:
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)。
我特别关心从 onPostExecute() 回调 Login.doFinished()。这对记忆有害吗?我担心这会导致 ParseXML 对象避免垃圾收集,因为它现在返回登录活动,一旦用户登录,它将继续运行,而 ParseXML 又保持打开状态。
我来自 PHP 背景,所以我一直在尝试将我的所有 XML 解析和 HTTP 处理保留在 ParseXML“模块”中,以便我知道在哪里寻找对此的更改。
目前ParseXML 处理所有http 工作,即getUsers、getChannels、addUser、delUser、doLogin 等。但是我是否应该尝试移动所有代码来处理 XML 和 HTTP相关屏幕/活动中的连接(异步),因此它们是独立的?
非常感谢您对此的任何帮助
【问题讨论】:
标签: java android android-asynctask