Android AsyncTask - 设计模式和返回值
我正在编写一个应用程序,用于验证外部网络服务器上的登录凭据 - 所以我有一个基本问题,即创建一个登录屏幕,提交时将向后台服务器发送 HTTP 请求,并且不会导致 UI 挂起 - 同时提供给用户一个 ProgressDialog。
我的问题在于,我想编写一个扩展 AsyncTask 的通用 HTTP Request 类,因此当我调用 .execute()
时,我将传递可能包含“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
}
}
这就是我能想到的,除了为我希望发出的每个 HTTP Post/GET 等请求创建一个类并扩展 ASyncTask...
这导致我遇到下一个问题,如果 HTTP POST 是成功并返回身份验证令牌,我如何访问此令牌?
因为 new httpOperations.execute() 不会从 doInBackground 返回字符串,而是返回类型的值,
抱歉,如果这没有意义,我根本无法弄清楚这一点。如果需要请详细说明。 AsyncTask 设计模式和想法受到了极大的欢迎。
I'm writing an application that validates login credentials on an external webserver - so I have the basic issue of creating a login screen that when submitted will send an HTTP request to a server in the background and not cause the UI to hang - whilst providing a ProgressDialog to the user.
My problem lies in, I want to write a generic HTTP Request class that extends AsyncTask, so when I call .execute()
I will then pass String parameters which may contain something like 'post', and when doInBackground
is called this will see the 'post' string and then forward those parameters onto the respective call in my class. Pseudo code would be something like
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
}
}
This is all I could think of, other than creating a class for every HTTP Post/GET etc request I wish to make and extending ASyncTask...
Which leads me to my next problem, if the HTTP POST is successful and it returns an authentication token, how do I access this token?
Because new httpOperations.execute(), does not return the string from doInBackground, but a value of type
Sorry if this doesn't make sense, I can't figure this out at all. Please ask for elaboration if you need it. AsyncTask design patterns and ideas are hugely welcomed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您正在为类似的事情设计可重用任务,则需要确定可重用返回类型。这是您的设计决定。问问自己,“我的 HTTP 操作在调用机制和处理数据的机制上是否相似?”如果是这样,您可以设计一个类来完成这两个任务。如果没有,您可能需要不同的类来执行不同的远程操作。
在我个人使用中,我有一个附加键值对的对象,常见的返回类型是 HttpEntity。这是 HTTP Get 和 Post 的返回类型,这在我的场景中似乎工作正常,因为我在异常 HTTP 结果情况下抛出异常,例如 404。此设置的另一个好处是,将参数附加到 get 的代码或 post 非常相似,所以这个逻辑很容易构建。
一个示例如下(psuedo):
然后在您的代码中进行下载:
然后在 DownloadAsyncTask 的构造函数中,存储 DownloadCallback,并在下载完成或失败时调用下载方法对应事件的回调。所以...
我要重申,我认为为了您自己的利益,您应该传回 HttpEntities。 String 现在看起来可能是个好主意,但是当您想要在 http 调用背后执行更复杂的逻辑时,它确实会带来麻烦。当然,这取决于你。希望这有帮助。
If you are designing a reusable task for something like this, you need to identify a reusable return type. Its a design decision on your part. Ask yourself, "Are my HTTP operations similar in both the mechanisms with which they are called and in which their data is processed?" If so, you can design a single class to do both. If not, you probably need different classes for your different remote operations.
In my personal use, I have an object i attach key value pairs to and the common return type is the HttpEntity. This is the return type for both HTTP Get and Post, and this seems to work ok in my scenarios because i throw exceptions in exceptional HTTP result situations, like 404. Another nice aspect of this setup is that the code to attach parameters to a get or post are fairly similar, so this logic is pretty easy to construct.
An example would be something like this (psuedo):
Then in your code, where you go to do the download:
Then inside the constructor of DownloadAsyncTask, store the DownloadCallback and, when the download is complete or fails, call the method on the download callback that corresponds to the event. So...
I'm going to reiterate that I think for the good of yourself, you should pass back HttpEntities. String may seem like a good idea now, but it really leads to trouble later when you want to do more sophisticated logic behind your http calls. Of course, thats up to you. Hopefully this helps.
假设Web api的数据格式是json,我的设计模式:
公共类
1.MyAsyncTask:扩展AsyncTask
2.BackgroundBase:服务器参数
3.API_Base:来自服务器的参数
4.MyTaskCompleted:回调接口
例如,让我们在一个 Activity 中调用两个 api
假设:
API 1.http://www.google.com/action/a
输入参数:ActionA
输出参数:RtnCode、ResultA
API 2.http://www.google.com/action/b
输入参数:ActionB
输出参数:RtnCode、ResultB
类,示例:
1.MyActivity :扩展 Activity 并实现 MyTaskCompleted
2.MyConfig:实用程序类,我在这里设置requestCode
3.BackgroundActionA、BackgroundActionB:api输入参数的模型类
4.API_ActionA、API_ActionB:api输出参数的模型类
这种设计模式的优点:
1.多api的一个优势
2.只需为新的api添加模型类,例如:BackgroundActionA和API_ActionA
3.通过回调函数中的不同requestCode来确定哪个API:onMyTaskCompleted
suppose the data format with web api is json, my design pattern :
common classes
1.MyAsyncTask : extends AsyncTask
2.BackgroundBase : parameters to server
3.API_Base : parameters from server
4.MyTaskCompleted : callback interface
example, let's call two api in one activity
assume :
API 1.http://www.google.com/action/a
input params : ActionA
output params : RtnCode, ResultA
API 2.http://www.google.com/action/b
input params : ActionB
output params : RtnCode, ResultB
classes with example :
1.MyActivity : extends Activity and implements MyTaskCompleted
2.MyConfig : utility class, i set requestCode here
3.BackgroundActionA, BackgroundActionB : model classes for api's input params
4.API_ActionA, API_ActionB : model classes for api's output params
Advantage with this design pattern :
1.one Advantage for multi api
2.just add model classes for new api, ex: BackgroundActionA and API_ActionA
3.determine which API by different requestCode in callback function : onMyTaskCompleted