AsyncTask Android - 设计模式和返回值

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调用后面做更复杂的逻辑时,它确实会导致麻烦.当然,这取决于你.希望这会有所帮助.