zoukankan      html  css  js  c++  java
  • AsyncHttpClient

    AsyncHttpClient有个特性:
    (11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中


    AsyncHttpClient Cookie相关的官方的文档

    This library also includes a PersistentCookieStore which
    is an implementation of the Apache HttpClient 
    CookieStore interface
    that automatically saves cookies to 
    SharedPreferences storage
    on the Android device.

    大概意思是将coolies自动保存到了首选项中。

    写Cookie的场景

       比如登录。在用户首次登录成功的时候,我们会从服务端取得Cookie,存储在用户手机的本地文件中。在用户下次打开应用时,会首先读取本地Cookie,Cookie没有过期的话,直接引导用户到相应界面,不再进行登录。

    读Cookie的场景

       除了登录之外,还有某些特殊的服务器请求,需要将本地Cookie信息一起发给服务端。


    AsyncHttpClient会获取到你的cookies然后自动保存到你的首选项中,这时候只需要我们手动set一下即可,这样就保持了和服务端的session一致问题,也不会导致出现401权限错误,代码如下:

    PersistentCookieStore myCookieStore = new PersistentCookieStore(this);  
    client.setCookieStore(myCookieStore); 


    测试代码:

    package com.example.cookietest;
    
    import java.util.List;
    
    import org.apache.http.Header;
    import org.apache.http.client.CookieStore;
    import org.apache.http.client.protocol.ClientContext;
    import org.apache.http.cookie.Cookie;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.protocol.HttpContext;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import com.example.cookietest.LoginManager.ICallBack;
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
    import com.loopj.android.http.PersistentCookieStore;
    import com.loopj.android.http.RequestParams;
    //参考文章:http://blog.csdn.net/jdsjlzx/article/details/44632451
    
    public class MainActivity extends Activity implements OnClickListener {
    	private final String TAG = "MainActivity";
    	//用户名
    	EditText etUserName;
    	// 密码
    	EditText etPwd;
    	// 登录按钮
    	Button btnLogin;
    	// 取消按钮
    	Button btnCancel;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		init();
    		App app = (App) this.getApplication();
    		app.mContext = getApplicationContext();
    		
    	}
    
    	private void init() {
    		etUserName = (EditText) findViewById(R.id.etUserName);
    		etPwd = (EditText) findViewById(R.id.etPwd);
    		btnLogin = (Button) findViewById(R.id.btnLogin);
    		btnCancel = (Button) findViewById(R.id.btnCancel);
    		btnLogin.setOnClickListener(this);
    		btnCancel.setOnClickListener(this);
    	}
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		switch (v.getId()) {
    		case R.id.btnLogin:
    			/*new LoginManager().login(etUserName.getText().toString(), etPwd.getText().toString(), new ICallBack() {
    				
    				@Override
    				public void onSuccess() {
    					// TODO Auto-generated method stub
    					Toast.makeText(App.mContext, "登录成功,cookie=" + Util.getPreference("cookie"), Toast.LENGTH_SHORT).show();
    					startActivity(new Intent(MainActivity.this, GetVideoListActivity.class));
    				}
    				
    				@Override
    				public void onFailed(String error) {
    					// TODO Auto-generated method stub
    					Toast.makeText(App.mContext, error, Toast.LENGTH_SHORT).show();
    				}
    			});*/
    			login(etUserName.getText().toString(), etPwd.getText().toString());
    			break;
    
    		case R.id.btnCancel:
    			this.finish();
    			break;
    		default:
    			break;
    		}
    	}
    	
    	private void login(String username, String password){
    		String url = URLContainer.getLoginUrl(
    				username, password);
    		final AsyncHttpClient client = new AsyncHttpClient();
    		
    		//保存cookie,自动保存到了shareprefercece
    		PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);  
            client.setCookieStore(myCookieStore);
            
    
    		client.post(url, new AsyncHttpResponseHandler() {
    
    			@Override
    			public void onFailure(int statusCode, Header[] headers,
    					byte[] errorResponse, Throwable e) {
    				Log.e(TAG, "获取数据异常 ", e);
    			}
    
    			@Override
    			public void onSuccess(int statusCode, Header[] headers, byte[] response) {
    				String json = new String(response);
    				Log.d(TAG, "onSuccess json = " + json);
    				
    			
    				//测试获得已经保存的cookie
    				Toast.makeText(App.mContext, "登录成功,cookie=" + getCookieText(), Toast.LENGTH_SHORT).show();
    				startActivity(new Intent(MainActivity.this, GetVideoListActivity.class));
    			}
    			
    		});
    		
    	}
    	
    	
    	/**
    	 * 获取标准 Cookie  
    	 */
    	private String getCookieText() {
    		PersistentCookieStore myCookieStore = new PersistentCookieStore(MainActivity.this);
    		List<Cookie> cookies = myCookieStore.getCookies();
    		Log.d(TAG, "cookies.size() = " + cookies.size());
    		Util.setCookies(cookies);
    		for (Cookie cookie : cookies) {
    			Log.d(TAG, cookie.getName() + " = " + cookie.getValue());
    		}
    		 StringBuffer sb = new StringBuffer();
    		for (int i = 0; i < cookies.size(); i++) {
    			 Cookie cookie = cookies.get(i);
    			 String cookieName = cookie.getName();
    			 String cookieValue = cookie.getValue();
    			if (!TextUtils.isEmpty(cookieName)
    					&& !TextUtils.isEmpty(cookieValue)) {
    				sb.append(cookieName + "=");
    				sb.append(cookieValue + ";");
    			}
    		}
    		Log.e("cookie", sb.toString());
    		return sb.toString();
    	}
    }
    

    代码下载:

    http://download.csdn.net/detail/jdsjlzx/8541657

    如有问题,请回复留言或者QQ:573842281


    鉴于很多网友对怎么使用还是有疑问,这里再补充下。


    自定义FinalAsyncHttpClient(注意:自定义是为了方便使用,每次从服务器请求数据都要带上cookie):

    package com.lindo.collector.http;
    
    import org.apache.http.cookie.Cookie;
    import org.apache.http.impl.client.BasicCookieStore;
    
    import android.content.Context;
    
    import com.lindo.collector.utils.MD5;
    import com.lindo.collector.utils.Utils;
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.RequestParams;
    
    public class FinalAsyncHttpClient {
    
    	AsyncHttpClient client;
    	
    	public FinalAsyncHttpClient() {
    		client = new AsyncHttpClient();
    		client.setConnectTimeout(5);//5s超时
    		if (Utils.getCookies() != null) {//每次请求都要带上cookie
    			BasicCookieStore bcs = new BasicCookieStore();
    			bcs.addCookies(Utils.getCookies().toArray(
    					new Cookie[Utils.getCookies().size()]));
    			client.setCookieStore(bcs);
    		}
    	}
    	
    	public AsyncHttpClient getAsyncHttpClient(){
    		return this.client;
    	}
    	
    	
    }
    


    请求数据:

    private void getJoinedDoingsInfo(String id) {
    		
    		String url = Constant.USER_JOINED_TASK_INFO_URL;
    		FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
    		AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();
    
    		RequestParams params = new RequestParams();
    		params.put("task_id", id);
    		client.get(url, params, new AsyncHttpResponseHandler() {
    
    
    			@Override
    			public void onFailure(int statusCode, Header[] headers,
    					byte[] responseBody, Throwable error) {
    
    			}
    
    			@Override
    			public void onSuccess(int statusCode, Header[] headers, byte[] data) {
    				String json = new String(data);
    				Log.d(TAG, "onSuccess " + json);
    				
    			}
    
    		});
    	}


    Utils.java

    public class Utils {
    
    	private static List<Cookie> cookies;
    
    	public static List<Cookie> getCookies() {
    		return cookies != null ? cookies : new ArrayList<Cookie>();
    	}
    
    	public static void setCookies(List<Cookie> cookies) {
    		Utils.cookies = cookies;
    	}
    
    	
    }
    


    登陆:

    private void login(final String phoneNum, final String userPass) {
    		Log.d(TAG, "login userPass = " + userPass);
    		String url = Constant.USER_LOGIN_URL;
    		FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
    		AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();
    		
    		saveCookie(client);
            
    		RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);
    		params.put("username", phoneNum);
    		params.put("pwd", userPass);
    		client.post(url, params, new AsyncHttpResponseHandler() {
    
    			@Override
    			public void onFailure(int statusCode, Header[] headers,
    					byte[] errorResponse, Throwable e) {
    				
    			}
    
    			@Override
    			public void onSuccess(int statusCode, Header[] headers,
    					byte[] response) {
    				Log.d(TAG, "onSuccess statusCode = " + statusCode);
    				String json = new String(response);
    				Utils.setCookies(getCookie());}});}

    在登陆时调用的方法

    protected void saveCookie(AsyncHttpClient client) {
    		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
    		client.setCookieStore(cookieStore);
    	}
    
    	protected List<Cookie> getCookie(){
    		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
    		List<Cookie> cookies = cookieStore.getCookies();
    		return cookies;
    	}
    	
    	public void clearCookie(){
    		PersistentCookieStore cookieStore = new PersistentCookieStore(this);
    		cookieStore.clear();
    	}


    在Activity中调用:

    private void getTaskPicTags(final String url){
    		Log.d(TAG, "getTaskPicTags url = " + url);
    		FinalAsyncHttpClient finalAsyncHttpClient = new FinalAsyncHttpClient();
    		AsyncHttpClient client = finalAsyncHttpClient.getAsyncHttpClient();
    		RequestParams params = finalAsyncHttpClient.getCommonRequestParams(this);
    		client.get(url, params, new AsyncHttpResponseHandler() {
    			
    			@Override
    			public void onSuccess(int statusCode, Header[] headers,
    					byte[] responseBody) {
    				String json = new String(responseBody);
    				 Log.d(TAG, "onSuccess " + json);
    				 			}
    
    			@Override
    			public void onFailure(int statusCode, Header[] headers,
    					byte[] responseBody, Throwable error) {
    				Log.e(TAG, "onFailure " , error);
    				 
    				
    			}
    		});
    	
    	}


     





  • 相关阅读:
    求数组中的最小子数组,时间复杂度o(n),java
    第四周进度条
    四则混合运算3
    软件工程作业3
    《构建之法》第三周阅读笔记
    第三周学习进度
    学习进度01
    构建之法阅读笔记01
    构建之法问题
    随机生成题目运算
  • 原文地址:https://www.cnblogs.com/Jxiaobai/p/6617678.html
Copyright © 2011-2022 走看看