一,sharedpreferences怎么获取,存取
它是直接在new出来的吗?(通过上下文获取)getSharedPreferences("config", Context.MODE_PRIVATE);
1,存数据的时候
//首先获取到一个编辑器,然后将数据put进去
Editor editor = sp.edit();
editor.putString("qq", qq);
editor.putString("pwd", pwd);
//保存数据完,一定要记得调用commit毕方法
editor.commit();
2,取数据的时候还需要先拿到编辑器吗?
sp.getString("qq", ""); //代表着取一个string类型的数据,key是qq,第二个参数是当key对应的引用不存在时,或者值不存在的时候,返回
的一个默认值!
练习常用的api ,它们的存储位置在哪里
context.getFileDir() /data/data/xxxxx(包名)/files
context.getCacheDir() /data/data/xxxxx(包名)/cache 相对来说不重要,保存一些临时的数据,可以随时删掉不影响程序的逻辑
openFileOutput(name,mode) /data/data/xxxxx(包名)/files 理解第二个参数的含义(设置访问的权限),第二个参数从哪里获取
(Context.MODE_PRIVATE (文件私有,其他程序不可读写), Context.MODE_WORLD_READABLE(全局可写,其他程序可读,但不可写), Context.MODE_WORLD_WRITEABLE全局可写,其他程序可写,但不可读)
如果想要可写可读,需要使用Context.MODE_WORLD_READABLE+Context.MODE_WRITEABLE
SD卡的相关操作(存储公用的文件)
检查权限(4.0之后系统加了一个sd卡读的权限,不过为了向老版本兼容,默认情况下是关闭的,)
不过要向sd卡写数据,是要写入权限的
android.permission.WRITE_EXTERNAL_STORAGE 写权限
android.permission.READ_EXTERNAL_STORAGE 读权限
//判断SD卡是否被挂载了
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
剩余空间
long size = Environment.getExternalStorageDirectory().getFreeSpace();
//可以在这里判断一下可用空间是否够用
//将size转为string格式的数据,这样可以给textview使用
String info = Formatter.formatFileSize(this, size);
二,ListView
是系统给我们提供的一个可以显示很多个item的控件.
使用步骤
1. 在布局xml文件声明listview控件
2. 在java代码找到listview控件,设置数据适配器,可以写一个内部类,继承BaseAdapter (内部类也可以,)
3. getCount()确定listview里面有多少个条目
4. getView(int position) 返回某个位置要显示的view对象
5. View.inflate() 打气筒 可以把xml文件转成view显示到界面
listview的优化原理(自己脑海里背一遍)
当我们滑动listview的时候,每当一个item看不见的时候,那么那个item就可以被复用起来了,也就是成为了convertView,那个时候convertView就不为null了
所谓的复用,其实本质是就是item的view对象没有真正的被垃圾回收器回收掉,而是重新将身上的数据
给换掉了,看起来好像是出现了一个新的item而已
三、使用httpclient的方式去请求服务器
思路:1,拿到浏览器HttpClient 2,输入一个地址(同时也是一种请求方式,有两种HttpGet,HttpPost) 3,敲回车只执行(httpClient.execute)
//1.拿到浏览器HttpClient
HttpClient client = new DefaultHttpClient();
//2.输入地址或者数据
HttpPost httpPost = new HttpPost(path);
//3.敲回车只执行
HttpResponse response = client.execute(httpPost);
获取状态码和httpUrlConnection有什么区别?
//httpClient的这种方式更加面向对象,代码更好理解
int code = conn.getResponseCode();
int code = response.getStatusLine().getStatusCode();
POST提交数据怎么设置提交的参数?
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("qq", qq));//map
parameters.add(new BasicNameValuePair("pwd", pwd));
httpPost.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
用这种方式要需要设置两个头信息吗?
不许要,应为HttpClient把这些细节都给封装起来了,不用需关心其中的细节
四,使用 asynchttpAndroid框架下的get和post请求(asyn:/a·sync/)
GET请求:(直接client.get)
其实本质是把httpclient,进行了下包装
直接拷贝模板代码进行即可
AsyncHttpClient client = new AsyncHttpClient();
//http相应的一个处理器
client.get(path, new AsyncHttpResponseHandler() {
@Override
//成功调用的方法
public void onSuccess(int statusCode, Header[] headers,
//服务器返回的数据所对应的二进制的数组
byte[] responseBody) {
//成功显示服务器返回的数组
tv_status.setText(new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
tv_status.setText("http请求失败"+new String(responseBody));
}
});
POST请求:(client.post(url,params,responseHander))
url参数是地址
params参数:请求参数实例代码可以拷贝
responseHander直接new出来重写它的两个方法(模板代码直接拷贝)
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("qq", qq);
params.put("pwd", pwd);
client.post(path, params, new AsyncHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
tv_status.setText("登陆结果:"+new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
tv_status.setText("请求失败请检查网络");
}
});