在我的项目中,我使用3层:Activity,DAO和Web Service Transaction,层Web Service Transaction有HttpClient在我的Web服务中执行Get和Post。
理解的一个例子:
//structure
send: Activity->DAO->WebService
response: WebService->DAO->Activity
这些是有效的,但我使用的是Threads,我不想再使用线程了。我想知道是否有任何方法可以创建一个可以返回布尔和List的通用AsyncTask?
寻找解决方案我创建了这个:Want to create a Generic AsyncTask但是对我不起作用,或者我无法理解它是如何工作的。
如何将AsyncTask作为我的项目在3层中工作?
所以,这是我的真实结构;
活动
public class MainActivity extends ActionBarActivity {
private EditText login, senha;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(android.os.Build.VERSION.SDK_INT > 9){
StrictMode.ThreadPolicy pol = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(pol);
}
login = (EditText)findViewById(R.id.usuario);
senha = (EditText)findViewById(R.id.senha);
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//invoke methods of UsuarioDAO
}
});
}
}
DAO
public class UsuarioDAO{
private HttpClientTransaction httpClient;
/** constructor */
public UsuarioDAO() {
httpClient = new HttpClientTransaction();
}
/** insert new object */
public Boolean insert(Usuario u){
boolean insert = false;
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("action", "add"));
nameValuePairs.add(new BasicNameValuePair("nome", u.getNome()));
nameValuePairs.add(new BasicNameValuePair("login", u.getLogin()));
nameValuePairs.add(new BasicNameValuePair("senha", u.getSenha()));
String s = "http://192.168.1.102/android/login.php";
String response = httpClient.post(nameValuePairs, s);
try {
JSONObject obj = new JSONObject(response);
if(obj.getString("erro").equals("1")){
insert = true;
}
} catch (JSONException e) {
e.printStackTrace();
}
return insert;
}
/** check if usuario has login */
public Boolean isLogin(Usuario u){
boolean login = false;
String s = "http://192.168.1.102/android/login.php?action=get&login=paiva&senha=123";
String response = httpClient.get(s);
try {
JSONObject obj = new JSONObject(response);
if(obj.getString("erro").equals("1")){
login = true;
}
} catch (JSONException e) {
e.printStackTrace();
}
return login;
}
/** return a list with all usuarios */
public List<Usuario> getAllUsuario(){
List<Usuario> list = new ArrayList<Usuario>();
String s = "http://192.168.1.102/android/login.php?action=getAll";
String response = httpClient.get(s);
try {
JSONObject obj = new JSONObject(response);
JSONArray jsArray = obj.getJSONArray("all");
for(int x = 0; x < jsArray.length(); x++){
JSONObject objArray = jsArray.getJSONObject(x);
Usuario u = new Usuario();
u.setNome(objArray.getString("nome"));
u.setLogin(objArray.getString("login"));
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
}
网络服务交易
public class HttpClientTransaction {
private static HttpClient httpClient;
public HttpClientTransaction() {
httpClient = HttpClientConnection.getHttpClient();
}
/** execute POST */
public String post(List<NameValuePair> list, String url){
String s = "";
try {
HttpPost httpPost = new HttpPost(url);
//httpPost.addHeader("Authorization", "Basic " + BasicAuthenticationRest.getBasicAuthentication());
httpPost.setEntity(new UrlEncodedFormEntity(list));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
if(entity != null){
s = EntityUtils.toString(entity);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return s;
}
/** execute GET */
public String get(String url){
String s = "";
try {
//executa o get
HttpGet httpGet = new HttpGet(url);
//httpGet.addHeader("Authorization", "Basic " + BasicAuthenticationRest.getBasicAuthentication());
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
if(entity != null){
s = EntityUtils.toString(entity);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
}
答案 0 :(得分:0)
对于我的问题,我解决了使用Volley Library现在的工作原理。
我做了这个
Volley Singleton
public class CustomVolleySingleton extends Application{
private static CustomVolleySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;
public static final String TAG = "VolleyPatterns";
private CustomVolleySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized CustomVolleySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new CustomVolleySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return mImageLoader;
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
应用程序控制器
public class ApplicationController extends Request<JSONObject>{
private Map<String, String> params;
private Response.Listener<JSONObject> listener;
//Construtores
public ApplicationController(String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = listener;
this.params = params;
}
public ApplicationController(int method, String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = listener;
this.params = params;
}
//método requerido.
protected Map<String, String> getParams() throws AuthFailureError {
return params;
};
//método requerido.
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
//método requerido
@Override
protected void deliverResponse(JSONObject response) {
listener.onResponse(response);
}
}
<强> UsuarioDAO 强>
public class UsuarioDAO{
private String url = "http://192.168.1.102/android/login.php?action=get&login=paiva&senha=123";
/** constructor */
public UsuarioDAO() {
}
public static ApplicationController isLogin(Usuario u, final UsuarioImp usuarioImp){
String s = "http://192.168.1.102/android/login.php?action=get&login=paiva&senha=123";
ApplicationController app = new ApplicationController(s,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject obj) {
try {
if(obj.getString("erro").equals("1")){
Usuario u = new Usuario();
u.setNome("Fernando Paiva - Logado");
usuarioImp.onLoginSuccess(u);
}else{
usuarioImp.onLoginFailure("Erro de login");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
//usuarioImp.onLoginFailure("erro de login");
}
});
return app;
}
Usuario界面
public interface UsuarioImp {
public void onLoginSuccess(Usuario u);
public void onLoginFailure(String message);
}
<强>活动强>
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ApplicationController app = UsuarioDAO.isLogin(new Usuario(), new UsuarioImp() {
@Override
public void onLoginSuccess(Usuario u) {
Log.i("USUARIO NOME: ", u.getNome());
}
@Override
public void onLoginFailure(String message) {
Log.i("ERROOOO: ", message);
}
});
CustomVolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(app);
CustomVolleySingleton.getInstance(getApplicationContext()).cancelPendingRequests(CustomVolleySingleton.TAG);
}
});