2014-09-24 38 views
-2

我开始建立一个应用程序,一些活动会从服务器获取&后的数据。例如,登录活动将发布用户名和密码以尝试登录,列表活动将从服务器数据库加载项目。现在,对于服务器和应用程序之间的每个通信,我使用一个AsyncTask来执行此操作。为了重用,我有一个基类MyAsyncTask类,每个真正的任务扩展它。如何设计AsyncTasks联网Android应用

public class MyAsyncTask extends AsyncTask<String, Integer, String>{ 

    protected String path; 

    public MyAsyncTask(Activity activity, String path){ 
     this.path=path;//each task will connect to its own url path 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String ret=null; 
     try { 
      ret=postData(params); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return ret; 
    } 

    public String postData(String... params) throws IOException{ 
     String httpUrl=Constants.SERVER_URL+path; 
     HttpPost httpRequest=new HttpPost(httpUrl); 
     List<NameValuePair> httpparams=formHttpParams(params); 
     //create HttpClient and connect to server and post data 
     ... ... 
    } 

    public ArrayList<NameValuePair> formHttpParams(String params[]){ 
     return new ArrayList<NameValuePair>();//sub classes need to override the parameter assignment 
    } 
    //protected void onPostExecute(String result) {}//override this for response handling 
} 

我的问题是,可以使用单个AsyncTask做到这一点?否则,我会有很多子类延伸MyAsyncTask这是处理Android网络应用程序的正确方法吗? (目前,如果我想做一个类,我会有复杂的参数解析过程并管理多个相应的路径。)

此外,如果我仍然使用多个子类来扩展此基类,是否会有单个我的应用程序和服务器之间的“会话”,所以我可以将用户身份信息(如用户名)保存在服务器的会话部分? (这是一个“面”的问题,因为我可以用这门课程的实验......)

+1

退房Volley ..还有很多其他人喜欢它。不要重新发明车轮,特别是如果你以前从未建造过汽车。 – 323go 2014-09-24 03:53:06

+0

很高兴知道Volley的官方解决方案。它应该是与AsyncTask一起固有的组件... PS,诅咒那些downvoters,哈... – mrmoment 2014-09-25 05:36:04

+0

Android的查询是一个选项,似乎更容易使用Web和纯Java的人,像我:) – mrmoment 2014-12-14 07:09:55

回答

0

你可以尝试使用Retrofit REST客户端从广场。 AsyncTask的主要问题是无法轻松处理方向更改,但如果要使用它,则可以在AsyncTask构造函数中传递Command

public interface Command { 
    public Object execute(); 
} 

public class MyTask extends AsyncTask<String, String, Object> { 

    private Exception e; 

    private Command command; 

    public MyTask(Command command) { 
     this.command = command; 
    } 

    public Object doInBackground() { 
     try { 
      return command.execute(); 
     } catch(Exception e) { 
      this.e = e; 
     } 

     return null; 
    } 

    public void onPostExecute(final Object result) { 
     //Handle your result 
    } 
} 

就是这样的。

1

我很久以前遇到了同样的问题。从那时起,我实现了自己的类来从服务器发布/获取JSON数据。当我打电话时,我使用一个接口来回调活动或片段,这样我只需要自定义回调,而不是整个Asynctask。类似:

/** 
* An interface for calling back from service 
* 
* @author 
* 
*/ 
public interface JSONCallback { 
    public void onError(String error); 
    /** 
    * A JSONObject or a JSONArray 
    * @param object 
    */ 
    public void onSuccess(Object object); 
} 


public static class PostTask extends AsyncTask<String, String, Integer>{ 

    Activity activity; 
    String message; 
    ProgressDialog pDialog; 
    Object object = null; 
    HttpEntity entity; 
    JSONCallback callback; 
    boolean getJSONArray; 
    private String error = null; 
    private HashMap<String, String> headers; 

    public HashMap<String, String> getHeaders() { 
     return headers; 
    } 

    public void setHeaders(HashMap<String, String> headers) { 
     this.headers = headers; 
    } 

    public PostTask(Activity activity, String message, HttpEntity entity, JSONCallback callback){ 
     this.activity = activity; 
     this.message = message; 
     this.entity = entity; 
     this.callback = callback; 
     this.getJSONArray = false; 
    } 

    public PostTask(Activity activity, String message, HttpEntity entity, JSONCallback callback, boolean getJSONArray){ 
     this.activity = activity; 
     this.message = message; 
     this.entity = entity; 
     this.callback = callback; 
     this.getJSONArray = getJSONArray; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     if(message != null){ 
      pDialog = ProgressDialog.show(activity, null, message, true, true, new DialogInterface.OnCancelListener() { 

       public void onCancel(DialogInterface dialog) { 
        cancel(true); //cancel this task 
       } 
      }); 
     } 

    } 


    @Override 
    protected Integer doInBackground(String... params) { 

     try { 
      object = getJSONPOST(activity, params[0], entity, getJSONArray, headers); 
      return 0; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return -1; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 

     try { 
      pDialog.dismiss(); 
     } catch (Exception e) { 
     } 

     if(callback!=null && !activity.isFinishing()){ 
      if(result == 0){ 
       callback.onSuccess(object); 
      }else{ 
       callback.onError(error); 
      } 
     } 
    } 
} 

public static Object getJSONPOST(Context context, String url, HttpEntity entity, boolean isJSONArray, HashMap<String, String> headers) throws ClientProtocolException, IOException, JSONException{ 

    DefaultHttpClient client = new DefaultHttpClient(); 
    try{ 
     client.getCookieStore().clear(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    HttpPost post = new HttpPost(url); 
    post.setEntity(entity); 
//  post.setHeader("content-type", "application/json"); 
//  post.setHeader("charset", "UTF-8"); 
    if(headers != null){ 
     Set<String> keys = headers.keySet(); 
     for(String key:keys){ 
//    Log.d("", "Header name: "+key+", header value: "+headers.get(key)); 
      post.setHeader(key, headers.get(key)); 
     } 
    } 
    HttpResponse response = client.execute(post); 

// Log.d( “”, “响应错误代码:” + response.getStatusLine()getStatusCode()); InputStream is = response.getEntity()。getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader( is,“UTF-8”),8); StringBuilder sb = new StringBuilder(); String line = null; ((line = reader.readLine())!= null){ sb.append(line +“\ n”); } is.close(); if(!isJSONArray) return new JSONObject(sb.toString()); else return new JSONArray(sb.toString()); }

注意,这个模型只是为了解释,应该用来创建你自己的,所以你可以适合你的需求。我已经完成了GET,PUT和DELETE方法。

边问:你可以从HttpClient的获得CookieManager(如果你使用cookies来保存会话),并将其存储在一个全球性的成员,或者坚持他们即使在应用程序关闭。这一切都取决于你在做什么。

希望它有帮助。