android学习之okhttp 实现与前后端通信

项目需求,音乐信息从后端获得,项目中用到 get / post请求

在使用OkHttp之前,引入库:

implementation 'com.squareup.okhttp:okhttp:2.7.5'
implementation 'com.squareup.okio:okio:1.11.0'

另外在AndroidManifest.xml中允许设备联网:


①异步post请求写法,为了方便以后,还是把全部代码贴了
我这里是把post请求写在一个函数里,在打开app的时候调用,即请求数据

public class MainActivity extends AppCompatActivity {
	/*
		这里声明一个handler来接收onReponse中传出来的数据,myPhotoUrlList就是我们需要也可以操控的数据了
		(我这里是把数据放进适配器,代码有点多,懒得放了,知道怎么拿出数据就好)
	*/
	 private Handler newHandler = new Handler() {
	        @Override
	        public void handleMessage(Message msg) {
	            super.handleMessage(msg);
	            System.out.print("进入handler");
	            switch (msg.what) {
	                case PHOTO_URL_LIST:
	                    myPhotoUrlList.addAll((List) msg.obj);  //注意这个方法!!!,这样才能赋值!!
	                    break;
	                //myphotoUrlList = (List) msg.obj;  //这个方法无法将数据传给myphotoUrlList!!!
	                case SONG_NAME_LIST:
	                    mySongNameList.addAll((List) msg.obj);
	                    break;
	                case SINGER_NAME_LIST:
	                    mySingerNameList.addAll((List) msg.obj);
	                    break;
	            }
	            bkImgadapter.notifyDataSetChanged();  //注意这个!!! 当适配器中的数据变化时,就会刷新适配器!!
	        }
	    };
    private OkHttpClient mHttpClient = new OkHttpClient();//1、获取 OkHttpClient 对象
     @Override
    protected void onCreate(Bundle savedInstanceState) {
   		 onPost("http://172.17.2.105:7000/requestmusic");//打开app请求数据, 这里的url根据实际改变
   	 }
   	 /**
        okHttp post提交数据
     */
    public void onPost(String url) {
        //数据类型为json格式,因为后端收到的数据格式为json,所以这里把post请求到 后端的字符串转换成json格式
        MediaType JSON = MediaType.parse("application/json; charset=utf-8"); //表示数据格式为json
        final String jsonStr = "{\"user_id\":\"2\"}";                   //1、json数据写成字符串形式.
        RequestBody requestBody = RequestBody.create(JSON, jsonStr);   //2、构造RequestBody
        //3、构造Request
        final Request request = new Request
                                        .Builder()
                                        .post(requestBody)
                                        .url(url)   //请求的地址,是onPost()传进来的参数
                                        .build();

        //4、将 Request 封装成 call
        final Call call = mHttpClient.newCall(request);
        //5、执行 call,这里就是异步的方法
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
				Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
            @Override
            public void onResponse(Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String res = response.body().string();	//res就是后端返回的数据
                    final MusicInfo musicInfo = new Gson().fromJson(res,MusicInfo.class); //通过Gson解析服务器返回的json数据
                    backImageList = new ArrayList<>();  //以背景图片数据为例子
                    
                    //MusicInfo是根据json数据结构写的一个bean类 ,里面的字段需要与json中的字段一致
                    //循环获取json数据中不同的具体数据
                    for(int i = 0;i < musicInfo.getData().size();i++){
                        backImageList.add(new back_imageBean(musicInfo.getData().get(i).photo_url.get(0)));
                        songNameList.add(musicInfo.getData().get(i).getSong_name());
                        singerNameList.add(musicInfo.getData().get(i).getSinger_name());
                    }
                    
                    /**
                    	下面这里是个重点,在post请求的onResponse中,在外面无法直接操控数据,
                    	所以需要用Message + handler去把数据拿出去,然后赋值给外面声明的一个列表,然后这个列表就是我们可以操控的
                    */
                    Message message = new Message();
                    message.obj = backImageList;
                    message.what = type;
                    newHandler.sendMessage(message);

                    /*
                        获取Post返回的数据中的音乐播放路径,存储在列表中
                     */
                    ArrayList mymusicPath = new ArrayList<>();
                    for(int i =0; i < musicInfo.getData().size();i++){
                        mymusicPath.add(musicInfo.getData().get(i).getPlay_url());
                        Log.i("歌曲路径 ", mymusicPath.get(i));

                    }
                    startService(mymusicPath); //这里是将播放路径传到服务中 属于另一个功能


                    //下面的留着做个参考吧 改变ui的写法
                    //onResponse 方法不能直接操作 UI 线程,利用 runOnUiThread 操作 ui
                    /*runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //mTextView.setText(newMusic.url);
                            Log.i(" ", res);
                            Log.i(" ", musicInfo.getData().get(0).getPlay_url());
                            //textView2.setText(res);
                        }
                    });*/
                }
            }
        });

    }
}

你可能感兴趣的:(android学习之okhttp 实现与前后端通信)