Tim*_*Tim 20 android design-patterns http android-asynctask
我正在编写一个验证外部Web服务器上的登录凭据的应用程序 - 所以我有一个基本的问题:创建一个登录屏幕,当提交时会在后台向服务器发送HTTP请求而不会导致UI挂起 - 同时提供对用户的ProgressDialog.
我的问题在于,我想编写一个扩展AsyncTask的通用HTTP Request类,所以当我调用时,.execute()我将传递String参数,这些参数可能包含类似'post'的内容,并且在doInBackground调用时会看到'post'字符串和然后将这些参数转发到我班级的相应电话中.伪代码就像是
public class HTTPOperations extends AsyncTask<String, Void, String>
{
doInBackground(String... string1,additionalParams)
{
if string1.equals "post"
response = httpPost(additionalParams)
return response;
}
httpPost(params)
{
// do http post request
}
}
Run Code Online (Sandbox Code Playgroud)
这是我能想到的,除了为我希望制作的每个HTTP Post/GET等请求创建一个类并扩展ASyncTask ...
这导致我的下一个问题,如果HTTP POST成功并返回一个身份验证令牌,我该如何访问此令牌?
因为新的httpOperations.execute(),不会从doInBackground返回字符串,而是返回值类型
对不起,如果这没有意义,我根本无法解决这个问题.如果需要,请索取详细说明.AsyncTask设计模式和想法受到了极大的欢迎.
Nic*_*ion 23
如果您正在为此类设计可重用任务,则需要确定可重用的返回类型.这是您的设计决定.问问自己,"我的HTTP操作在调用它们的机制和处理它们的数据方面是否相似?" 如果是这样,您可以设计一个类来执行这两个操作.如果没有,您可能需要为您的不同远程操作使用不同的类.
在我个人的使用中,我有一个对象,我附加键值对,常见的返回类型是HttpEntity.这是HTTP Get和Post的返回类型,这似乎在我的场景中正常工作,因为我在异常的HTTP结果情况下抛出异常,例如404.此设置的另一个好处是将参数附加到get的代码或者帖子非常相似,所以这个逻辑很容易构建.
一个例子就是这样(psuedo):
public interface DownloadCallback {
void onSuccess(String downloadedString);
void onFailure(Exception exception);
}
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中,你去哪里下载:
DownloadCallback dc = new DownloadCallback(){
public void onSuccess(String downloadedString){
Log.d("TEST", "Downloaded the string: "+ downloadedString);
}
public void onFailure(Exception e){
Log.d("TEST", "Download had a serious failure: "+ e.getMessage());
}
}
DownloadAsyncTask dlTask = new DownloadAsyncTask(dc);
Run Code Online (Sandbox Code Playgroud)
然后在DownloadAsyncTask的构造函数中,存储DownloadCallback,并在下载完成或失败时,调用与该事件对应的下载回调方法.所以...
public class DownloadAsyncTask extends AsyncTask <X, Y, Z>(){
DownloadCallback dc = null;
DownloadAsyncTask(DownloadCallback dc){
this.dc = dc;
}
... other stuff ...
protected void onPostExecute(String string){
dc.onSuccess(string);
}
}
Run Code Online (Sandbox Code Playgroud)
我要重申,我认为为了自己的利益,你应该回传HttpEntities.字符串现在似乎是一个好主意,但是当你想要在http调用后面做更复杂的逻辑时,它确实会导致麻烦.当然,这取决于你.希望这会有所帮助.