我正在研究一个Android项目(API级别10),该项目需要向服务器发送HTTP消息或从服务器接收HTTP消息。
我实现了一个名为NetworkManager的类,该类提供了不同的方法,每个http请求都有一个方法(例如:loginRequest(user pass),RegistrationRequest(user .....))。
所有这些方法都会生成一个JSON对象,该对象将传递给名为sendMessage的方法,该方法实际上是建立连接,发送和接收响应的方法(也是json对象)。
当然,网络调用非常耗时,因此我首先决定在执行网络操作时使用AsyncTask来显示progressDialog。
问题在于,在执行任何其他涉及主线程完成结果本身的操作之前,我需要从后台线程获取响应值。
同时,我想对AsyncTask进行通用且可重用的实现。
例如:我有一个登录活动,其中显示2个EditText(用户名,密码)和一个名为Login的按钮。当我按下登录按钮时,必须出现一个progressDialog,并且必须在完成doInBackground任务后将其丢弃。我当然可以这样:
onClick(View v) //called when the login button is pressed
{
onPreExecute()
{
//Show the progress dialog
}
doInBackground()
{
//Retreive the login response (an integer containing a message code) using sendLoginRequest(username, password);
//return the response
}
onPostExecute(int response)
{
//Dispose the progress dialog, then loginSucessfull ? start new activity : show error toast
}
}
但是,这样做,我应该为需要发送的每个请求实现一个异步任务,这是我要避免的事情,因为如果我有N个请求,我应该创建N个扩展AsyncTask的类。
谢谢!
最佳答案
我建议您使用INTERFACES处理HTTP请求的响应。
后台线程是AysncTask还是Thread需要同时处理
响应
例外
这样想
MainThread-嘿,后台线程执行此操作,并在完成时通知我。
MainThread-确定,直到背景线程执行其操作,让我显示进度对话框。
BackGroundThread-我的工作完成了。嘿MainThread在这里捕获您的响应或异常
MainThread-让我停止显示进度栏。
因此,我们需要通过代码模拟这种回调机制,并且还需要注意实现可重用的体系结构。
像这样
定义接口
public interface HttpRequestResponse {
public void onSuccess(HttpResponse response);
public void onException(Exception exception);
}
class HttpRequestResponseHandler {
private ActionItem action;
private HttpRequestResponse hrr;
private Executor executor;
public enum ActionItem {
LOGIN_REQUEST ,
REGISTRATION_REQUEST
}
public HttpRequestResponseHandler(ActionItem action, HttpRequestResponse hrr) {
this.action = action;
this.hrr = hrr;
}
public void execute(){
executor = new Executor();
executor.execute();
}
private class Executor extends AsyncTask<Void,Void,Void> {
@Override
public Void doInBackground() {
switch(action) {
case LOGIN_REQUEST : doLogin();
break;
case REGISTRATION_REQUEST : doRegistration();
break;
}
}
}
private void doLogin() {
HttpResponse response = null;
Exception exception = null;
try {
response = makeHttpRequestHere();
} catch (Exception e) {
exception = e;
}
if(exception != null) {
hrr.onException(exception);
} else {
hrr.onSuccess(response);
}
}
}
现在,在您的活动代码文件中的某处执行以下操作。
HttpRequestResponse hrr = new HttpRequestResponse(){
@Override
public void onSuccess(HttpResponse response) {
hideProgressDialog();
handleResponse(response);
}
@Override
public void onException(Exception exception) {
hideProgressDialog();
showErrorDialog(exception.getMessage());
}
}
HttpRequestResponseHandler hrrh = new HttpRequestResponseHandler(ActionItem.LOGIN_REQUEST,hrr);
hrrh.execute();
showProgressDialog();
希望所有这些都能带来您想要的。
这是一个很长的答案,并且花了我很大的力气才能弄清楚。 :)