Android学习系列笔记(五)

##Android基础网络第二天

1 post方式提交数据乱码的解决

1一般在公司开发客户端和服务端的编码要保持一致。 2android端的默认编码是utf-8; 3 4做url请求时需要对参数进行URLEncode编码. 5 6URL url = new URL("http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username)+"&pwd="+URLEncoder.encode(password)); 7 8 9connection.setDoOutput(true); 10connection.getOutputStream().write(parmes.getBytes());

2 get方式提交数据乱码解决

URLEncode

3 httpclient方式提交数据到服务器

1 HttpClient: 2 3get方式: 4 //使用HttpClient请求服务器将用户密码发送服务器验证 5 try{ 6 String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8"); 7 //1.创建一个httpClient对象 8 HttpClient httpclient = new DefaultHttpClient(); 9 10 //2.设置请求的方式 11 HttpGet httpget = new HttpGet(path); 12 //3.执行一个http请求 13 HttpResponse response = httpclient.execute(httpget); 14 //4.获取请求的状态码, 15 StatusLine statusLine = response.getStatusLine(); 16 int code = statusLine.getStatusCode(); 17 18 //5.判断状态码后获取内容 19 if(code == 200){ 20 HttpEntity entity = response.getEntity();//获取实体内容,中封装的有http请求返回的流信息 21 InputStream inputStream = entity.getContent(); 22 //将流信息转换成字符串 23 String result = StreamUtils.streamToString(inputStream); 24 25 Message msg = Message.obtain(); 26 msg.what = 1; 27 msg.obj = result; 28 handler.sendMessage(msg); 29 } 30 31 }catch (Exception e) { 32 e.printStackTrace(); 33 } 34post方式: 35 36 37 //使用UrlConncetion请求服务器将用户密码发送服务器验证 38 try{ 39 String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet"; 40 //1.创建一个httpclient对象 41 HttpClient httpclient = new DefaultHttpClient(); 42 //2.创建一个请求方式 43 HttpPost httppost = new HttpPost(path); 44 //创建集合封装数据 45 ArrayList<BasicNameValuePair> arrayList = new ArrayList<BasicNameValuePair>(); 46 BasicNameValuePair nameValuePair = new BasicNameValuePair("username",username); 47 arrayList.add(nameValuePair); 48 BasicNameValuePair nameValuePair1 = new BasicNameValuePair("pwd",password); 49 arrayList.add(nameValuePair1); 50 51 //创建一个Entity 52 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(arrayList, "utf-8"); 53 //设置请求时的内容 54 httppost.setEntity(entity); 55 56 //3.执行一个请求,返回一个response对象 57 HttpResponse response = httpclient.execute(httppost); 58 //4.获取状态码 59 int code = response.getStatusLine().getStatusCode(); 60 //5.判断并获取内容 61 if(code == 200){ 62 HttpEntity entity1 = response.getEntity();//获取实体内容,中封装的有http请求返回的流信息 63 InputStream inputStream = entity1.getContent(); 64 //将流信息转换成字符串 65 String result = StreamUtils.streamToString(inputStream); 66 Message msg = Message.obtain(); 67 msg.what = 2; 68 msg.obj = result; 69 handler.sendMessage(msg); 70 } 71 72 }catch (Exception e) { 73 e.printStackTrace(); 74 }

4开源项目get post 方式提交 (asyncHttpClient)

1 get方式: 2 3 4 public static void requestNetForGetLogin(final Context context,final Handler handler ,final String username, final String password) { 5 //使用HttpClient请求服务器将用户密码发送服务器验证 6 try{ 7 String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8"); 8 9 //创建一个AsyncHttpClient对象 10 AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); 11 asyncHttpClient.get(path, new AsyncHttpResponseHandler() { 12 13 [@Override](https://my.oschina.net/u/1162528) 14 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 15 //statusCode:状态码 headers:头信息 responseBody:返回的内容,返回的实体 16 //判断状态码 17 if(statusCode == 200){ 18 //获取结果 19 try { 20 String result = new String(responseBody,"utf-8"); 21 Toast.makeText(context, result, 0).show(); 22 } catch (UnsupportedEncodingException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 } 28 29 [@Override](https://my.oschina.net/u/1162528) 30 public void onFailure(int statusCode, Header[] headers, 31 byte[] responseBody, Throwable error) { 32 33 System.out.println("...............onFailure"); 34 35 } 36 }); 37 }catch (Exception e) { 38 e.printStackTrace(); 39 } 40} 41 42 43 post方式: 44 45 46 String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet"; 47 48 AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); 49 RequestParams params = new RequestParams(); 50 params.put("username", username); 51 params.put("pwd", password); 52 53 //url: parmas:请求时携带的参数信息 responseHandler:是一个匿名内部类接受成功过失败 54 asyncHttpClient.post(path, params, new AsyncHttpResponseHandler() { 55 56 [@Override](https://my.oschina.net/u/1162528) 57 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 58 //statusCode:状态码 headers:头信息 responseBody:返回的内容,返回的实体 59 60 //判断状态码 61 if(statusCode == 200){ 62 //获取结果 63 try { 64 String result = new String(responseBody,"utf-8"); 65 Toast.makeText(context, result, 0).show(); 66 } catch (UnsupportedEncodingException e) { 67 // TODO Auto-generated catch block 68 e.printStackTrace(); 69 } 70 } 71 72 } 73 74 [@Override](https://my.oschina.net/u/1162528) 75 public void onFailure(int statusCode, Header[] headers, 76 byte[] responseBody, Throwable error) { 77 78 } 79 });

5 文件上传的操作

1 使用第三方utils做文件上传。 2 3public void fileupload(View v){ 4 try{ 5 EditText et_filepath = (EditText) findViewById(R.id.et_filepath); 6 //获取输入的文件地址 7 String filepath = et_filepath.getText().toString().trim(); 8 9 //使用开源Utils做上传操作 10 AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); 11 12 RequestParams params = new RequestParams(); 13 params.put("filename", new File(filepath)); 14 //url : 请求服务器的url 15 asyncHttpClient.post("http://192.168.13.83:8080/itheima74/servlet/UploaderServlet", params, new AsyncHttpResponseHandler() { 16 17 [@Override](https://my.oschina.net/u/1162528) 18 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 19 if(statusCode == 200){ 20 Toast.makeText(MainActivity.this, "上传成功", 0).show(); 21 } 22 } 23 @Override 24 public void onFailure(int statusCode, Header[] headers, 25 byte[] responseBody, Throwable error) { 26 } 27 }); 28 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32}

6 多线程加速下载的原理

1 1.线程越多下载越快?? 不是。 与 本地网络带宽, 服务器资源的带宽 有关 2 2.迅雷:3-5个。 3 4 多线程下载的步骤: 5 6 1.要知道服务端资源的大小。 7 8 通过URLConnection请求服务器url获取。 9 UrlConnection.getContentLength();//资源的大小 10 11 2.在本地创建一个与服务端资源同样大小的一个文件(占位) 12 //file : 文件; mode:文件的模式,rwd:直接写到底层设备,硬盘 13 RandomAccessFile randomfile =new RandomAccessFile(File file,String mode) 14 15 randomfile.setLength(long size);//创建一个文件和服务器资源一样大小 16 17 3.要分配每个线程下载文件的开始位置和结束位置。 18 19 4.开启线程去执行下载 20 通过UrlConnection下载部分资源。 21 注意: 22 1.需要Range头,key:Range value:bytes:0-499 23 urlconnection.setRequestPropety("Range","bytes:0-499") 24 2.需要设置每个线程在本地文件的保存的开始位置 25 RandomAccessFile randomfile =new RandomAccessFile(File file,String mode) 26 randomfile.seek(int startPostion);//本次线程下载保存的开始位置。 27 28 5.要知道每个线程下载完毕。

7 javase 多线程下载

8 多线程断点续传实现

9 Android版本多线程下载

		安智: sdcard没有判断。uc

10 开源项目实现多线程下载 (xutils)

1 public void download(View v){ 2 EditText et_url = (EditText) findViewById(R.id.et_url); 3 String url = et_url.getText().toString().trim(); 4 //1.创建httpUtils对象 5 HttpUtils httpUtils = new HttpUtils(); 6 //2.调用download方法 url:下载的地址 target:下载的目录 callback:回调 7 httpUtils.download(url, "/sdcard/feiqiu/feiq.exe", new RequestCallBack<File>() { 8 @Override 9 public void onLoading(long total, long current, boolean isUploading) { 10 System.out.println("total:"+total+";current:"+current); 11 super.onLoading(total, current, isUploading); 12 } 13 @Override 14 public void onSuccess(ResponseInfo<File> responseInfo) { 15 System.out.println(responseInfo.result); 16 } 17 @Override 18 public void onFailure(HttpException error, String msg) { 19 // TODO Auto-generated method stub 20 21 } 22 }); 23}

2天网络内容大复习

总结:

1第一天: android入门: 2 3 1.环境搭建 4 5 jdk+ eclipse+android sdk 6 7 2,项目结构介绍 8 熟悉各个目录的用途. 9 3.五大布局 10 11 LinearLayout + RelativeLayout 12 控件: EditText TextVeiw Button ImageView ListView ScrollView CheckBox ProgressBar 13 4.adb的练习 14 adb devices 15 adb install ; adb uninstall ; adb push ;adb pull;logcat ;adb shell 16 adb kill-server ;adb start-server ;adb shell+input text ;adb shell+monkey 17 18 5.android系统架构 19 4层; 20 21 22 6. 电话拨号器 23 24 Intent intent = new Intent(); 25 intent.setAction(); 26 intent.setData(); 27 startActivity(); 28 29 30第二天:数据的存储 31 32 1.登录案例 33 34 File file = context.getFilesDir(); 35 context.openFileOutput(String filename,String mode);//mode:Context.Mode_Private 36 context.openFileInput(String filename); 37 38 2.sdcard的使用 39 1.权限 40 2.硬性编码 41 File file = Enviroment.getExternalStorageDirectory();//获取sdcard的目录文件 42 3.判断sdcard状态 43 boolean state = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 44 4.判断sdcard大小 45 File file = Enviroment.getExternalStorageDirectory();//获取sdcard的目录文件 46 long usablespace= file.getUsableSpace(); 47 String usablespace_str= Formatter.foramatterFilesize(long size); 48 49 4.SharedPreference的使用 50 51 1.保存数据 52 53 a. 获取一个sharedpreference对象 54 Sharedpreference sharedpreference = context.getShare..(String name ,String mode); 55 b.得到一个Editor对象 56 Editor editor = sharedpreference.edit(); 57 c.往Editor中添加数据 58 editor.putString(String key ,Stirng value); 59 d.提交Editor 60 editor.commit(); 61 62 63 2.读取数据 64 65 a. 获取一个sharedpreference对象 66 Sharedpreference sharedpreference = context.getShare..(String name ,String mode); 67 b.使用sharedpreference获取数据 68 sharedpreference.getString(String key ,String defValue); 69 70 5.xml的生成与解析 71 a.生成 XmlSerializer 模板代码 72 b.解析 XmlPullParser 模板代码

第三天: 数据库 listview

1 1.数据库的使用 对于一个数据库2个类, 1是帮助类 SqliteOpenHelper 2是Dao类封装增删改查 2 3 1.创建数据库 4 创建一个类集成SqliteOpenHelper 创建一个构造方法设置数据库的名称,版本,实现两个方法,oncteate:特别适合做表结构的初始化,数据库第一次创建的时候调用。 5 onupgrade:特别适合做表结构的修改,数据库版本发生改变时调用 6 2.增删改查 7 a.创建一个帮助类的对象,并调用getReadableDatabase或getWriteableDatabase帮助获取一个SqliteDatabase数据库操作对象。 8 9 b.使用SqliteDatabase数据库操作对象做增删改查 10 2种方式 11 1.调用execSql(String sql ,Object[] obj)可以做增删改,调用rawQuery(String sql ,Object[] obj)做查询,返回一个Cursor对象,遍历Cursor获取查询结果。 12 2.调用insert delete update query做增删改查 13 14 第一种方式适合做查询,第二种方式有了返回值,更适合做的增删改 15 16 17 2.listview的使用 18 19 1.写布局 20 2.找到listview,并设置条目的点击事件 21 listview.setOnItemClickListener(OnItemClickListener on); 22 3.获取listview条目上要展示的数据到list集合中,传给adapter做控制显示 23 4.写一个类集成BaseAdapter,实现四个方法,写一个构造方法接受list集合中的数据 24 25 getCount();返回listview要显示的条目数 26 getItem(int postion);返回listveiw上postion位置上的Bean对象 27 getId();返回postion 28 *****getView();告诉listview条目要显示的内容 29 1.模板代码优化listview 30 2.创建一个item布局转化成view对象作为getview的返回值 31 3.获取item布局中子控件 32 4.获取list集合中postion位置的Bean对象 33 5.将Bean中的数据设置给子控件做展示 34 5.创建一个adapter,并设置给listview 35 listveiw.setAdapter(ListAdapter adapter) 36 6.实现条目点击事件的操作

第四天:网络编程

1 1.使用UrlConnection连接网络获取数据 2 3 1.创建一个Url对象 4 2.使用URL对象获取一个HttpUrlConnection 5 3.设置connection对象的参数 6 4.获取状态码 7 5.获取流信息。 8 9 10 2.主线程不能做耗时的操作(网络请求),只能在子线程中请求;子线程不能更新UI;解决办法:Handler 11 12 3.使用handler 13 1.主线程创建Handler,重写handlermessage方法 14 2.子线程中创建Message对象,携带子线程获取的数据 15 3.使用主线程的handlerf发送message到主线程 16 4.主线程的handlerMessage方法接受数据,处理Ui 17 18 4.流转图片 19 20 Bitmap bitmap = BitmaptFatory.decodeStream(InputStream in); 21 5.网络版新闻: 数据库 listview URLConnection Json解析 Handler 22 json解析: 23 JsonObject JsonArray 24 6.get post请求网络 25 post提交数据需要设置内容到写入流: 26 connection.setDoOut(true; 27 connection.getOutputStream().write(byte[]); 28 7.解决乱码问题 29 1.客户端和服务端编码保持一致 30 2.提交的数据需要用URLEncode编码

第五天 网络请求2 HttpClient 文件上传 多线程下载

1 1.HttpClent: 2 1.创建一个DefaultHttpclient 3 2.创建一个请求方式 HttpGet HttpPost 4 5 Arraylist<BaicNameValueparire> list = new Arraylist<BaicNameValueparire>(); 6 BaicNameValueparire valuse = BaicNameValueparire() 7 valuse.put(String key ,String valuse); 8 list.add(valuse); 9 UrlEncodeFormEntity entity = new UrlEncodeFormEntity(List<NameValuepare>); 10 HttpPost.setEntity(entity); 11 12 3.httpclient执行请求 13 httpeclient.execut(HttpGet httpget) 14 4.获取响应码 15 httpclient.getStateLines().getstateCode(); 16 5.获取内容 17 InputStream in = httpclient.getEntry.getContent(); 18 19 2.文件上传 使用开源项目 AsycnHttpClient 20 21 3.多线程断点续传下载 22 23 1.获取资源大小 24 2.本地创建一个与服务端一致的文件 25 RandmodAcecssFile 26 3.根据线程数量计算每个线程下载的开始位置,结束位置 27 28 4.开启线程进行真实的下载。 29 header : Range value : bytes:0-499 30 UrlConnection.setRequestProperty(String header , String value); 31 32 5.将读取 的流分段写入文件 33 RandmodAcecssFile file = new RandmodAcecssFile(File file,String mode); 34 file.seek(int startIndex);//设置文件从哪里开始写入 35 6.ProgressBar : 主要属性 : style 样式 max 最大进度 progress 当前进度
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang