zoukankan      html  css  js  c++  java
  • 团队开发冲刺日(十二)

      今天完成了Android端的okhttp部分,实现连接Servlet,下面做个总结。

      昨天我说object转file存在问题,后来我仔细看了一下代码(之前都是照着博客写的,有些数据类型还不清楚),发现存入HashMap里的图片都是Bitmap数据类型,因此我更改了一下HashMap的结构:

    private ArrayList<HashMap<String, Bitmap>> imageItem;

    后面取值则变成了这样:

     1 for(HashMap<String,Bitmap>pic:imageItem){
     2                     Set<String> set=pic.keySet();
     3                     for(String key:set){
     4                         if(pic_i==0){
     5                             //跳过默认的+号图片
     6                             pic_i++;
     7                             continue;
     8                         }
     9                         //取出bitmap,转换成file,上传
    10                         else if(pic_i==1){
    11                             Bitmap fbm1 = pic.get(key);
    12                             File dofile = doImage(fbm1);
    13                             builder.addFormDataPart("image1",dofile.getName(),RequestBody.create(PNG,dofile));
    14                             pic_i++;
    15                         }
    16                         else if(pic_i==2){
    17                             Bitmap fbm2 = pic.get(key);
    18                             File dofile = doImage(fbm2);
    19                             builder.addFormDataPart("image2",dofile.getName(),RequestBody.create(PNG,dofile));
    20                             pic_i++;
    21                         }
    22                         else if(pic_i==3){
    23                             Bitmap fbm3 = pic.get(key);
    24                             File dofile = doImage(fbm3);
    25                             builder.addFormDataPart("image3",dofile.getName(),RequestBody.create(PNG,dofile));
    26                             pic_i++;
    27                         }
    28                     }
    29                 }

    Bitmap转file使用单独的一个函数完成:

     1  //Bitmap转file
     2     public static File doImage(Bitmap fbitmap){
     3         ByteArrayOutputStream fbaos = new ByteArrayOutputStream();
     4         fbitmap.compress(Bitmap.CompressFormat.JPEG,100,fbaos);
     5         int options = 100;
     6         //判断是否大于20kb,是则继续压缩
     7         while(fbaos.toByteArray().length/1024>20){
     8             fbaos.reset();
     9             options-=10;
    10             fbitmap.compress(Bitmap.CompressFormat.JPEG,options,fbaos);
    11             long length = fbaos.toByteArray().length;
    12         }
    13         SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    14         Date date = new Date(System.currentTimeMillis());
    15         String filename = format.format(date);
    16         File file = new File(Environment.getExternalStorageDirectory(),filename+".png");
    17         //注意创建文件,否则会发生文件读取错误
    18         if(!file.exists()){
    19             try{
    20                 file.createNewFile();
    21             }catch (IOException e){
    22                 e.printStackTrace();
    23             }
    24         }
    25         try{
    26             FileOutputStream fos = new FileOutputStream(file);
    27             try{
    28                 fos.write(fbaos.toByteArray());
    29                 fos.flush();
    30                 fos.close();
    31             } catch (IOException e) {
    32                 e.printStackTrace();
    33             }
    34         }catch (IOException e){
    35             e.printStackTrace();
    36         }
    37         return file;
    38     }

    注意行18,一开始我是没有写这里的,但是在运行的时候报了java.io.FileNotFoundException错误,包括了未找到文件等等错误,首先是补上上面的file.createNewFile(),之后还要设置一下Android的读写权限,在AndroidManifest.xml文件中,与<application>同级的地方写入下面的代码:

    1 <uses-permission android:name="android.permission.INTERNET"/>
    2     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    3     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    以上是关于图片文件的设置。

    接下来是okhttp的连接设置:

    okhttp部分完整代码:

     1 //OKHttp
     2                 OkHttpClient client = new OkHttpClient();
     3                 MultipartBody.Builder builder = new MultipartBody.Builder();
     4                 builder.setType(MultipartBody.FORM);
     5                 builder.addFormDataPart("title",title_str);
     6                 builder.addFormDataPart("note",note_str);
     7                 builder.addFormDataPart("see",see_str);
     8 
     9                 int pic_i=0;
    10                 //本地Tomcat,注意不能写localhost,写本机的ip地址
    11                 String URL="http://192.168.101.18:8080/CloudNote/CloudServlet";
    12                 for(HashMap<String,Bitmap>pic:imageItem){
    13                     Set<String> set=pic.keySet();
    14                     for(String key:set){
    15                         if(pic_i==0){
    16                             //跳过默认的+号图片
    17                             pic_i++;
    18                             continue;
    19                         }
    20                         //取出bitmap,转换成file,上传
    21                         else if(pic_i==1){
    22                             Bitmap fbm1 = pic.get(key);
    23                             File dofile = doImage(fbm1);
    24                             builder.addFormDataPart("image1",dofile.getName(),RequestBody.create(PNG,dofile));
    25                             pic_i++;
    26                         }
    27                         else if(pic_i==2){
    28                             Bitmap fbm2 = pic.get(key);
    29                             File dofile = doImage(fbm2);
    30                             builder.addFormDataPart("image2",dofile.getName(),RequestBody.create(PNG,dofile));
    31                             pic_i++;
    32                         }
    33                         else if(pic_i==3){
    34                             Bitmap fbm3 = pic.get(key);
    35                             File dofile = doImage(fbm3);
    36                             builder.addFormDataPart("image3",dofile.getName(),RequestBody.create(PNG,dofile));
    37                             pic_i++;
    38                         }
    39                     }
    40                 }
    41                 RequestBody requestBody = builder.build();
    42                 Request.Builder RequestBuilder = new Request.Builder();
    43                 RequestBuilder.url(URL);
    44                 RequestBuilder.post(requestBody);
    45                 final Request request=RequestBuilder.build();
    46                 client.newCall(request).enqueue(new Callback() {
    47                     @Override
    48                     public void onFailure(@NotNull Call call, @NotNull IOException e) {
    49                         Log.i("TRYxxx","连接失败");
    50                         e.printStackTrace();
    51                     }
    52 
    53                     @Override
    54                     public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    55                         Log.i("TRYxxx","连接的消息"+response.message());
    56                         if(response.isSuccessful()){
    57                             Log.i("TRYxxx","连接成功获取的内容"+response.body().string());
    58                             Log.i("TRYyyy",title_str);
    59                             Log.i("TRYyyy",note_str);
    60                             Log.i("TRYyyy",see_str);
    61                         }
    62                     }
    63                 });

    这里注意连接设置的地方是行11,我一开始是使用本地连接进行尝试,输入的是localhost:8080,但这么写是有问题的,需要把localhost改成本机的ip的地址才能连接。随后在AndroidManifest.xml文件中写入网络连接请求(上面发过一次了):

    <uses-permission android:name="android.permission.INTERNET"/>

    最后就是对界面的一些改动,Switch控件监听我没有使用明白,不能正确地赋值,因此我改用了RadioGroup,界面如下:

     最后看看Log.i显示的效果:

     后面不知道为何没有显示,但总体上是成功了。

    出现问题:Servlet接收的参数为null。排查中。

  • 相关阅读:
    delphi7下调用微软的Web Services的心得
    Asp.net组件设计浅论
    STC系统烧写及STC12C5A60S2最小系统
    ENET 1.3.3 VC2005 下使用
    ENet library compilation record
    51定时器
    可靠的UDP编程(ENET库)
    ASP.NET MVC3布局页与分布页调用方式概述
    排除JQuery通过HttpGet调用WebService返回Json时“parserror”错误
    AJAX数据源协调处理思路
  • 原文地址:https://www.cnblogs.com/20183711PYD/p/12770293.html
Copyright © 2011-2022 走看看