【问题标题】:Creating an AsyncTask to work with 3 layers?创建一个 AsyncTask 以使用 3 层?
【发布时间】:2014-11-22 21:37:56
【问题描述】:

在我的项目中,我使用 3 层:Activity、DAO 和 Web Service Transaction,层 Web Service Transaction 具有 HttpClient 来在我的 Web 服务中执行 Get 和 Post。

一个例子来理解: //structure send: Activity->DAO->WebService response: WebService->DAO->Activity

这些工作,但我正在使用线程,我不想再使用线程。我想知道是否有任何方法可以创建可以返回 Boolean 和 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;
    }    

}

Web 服务事务

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;
    }


}

【问题讨论】:

    标签: android web-services android-asynctask


    【解决方案1】:

    对于我的问题,我使用 Volley Library 解决了,现在可以使用了。

    我做了这个

    凌空单例

    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);
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      相关资源
      最近更新 更多