项目需求,音乐信息从后端获得,项目中用到 get / post请求
在使用OkHttp之前,引入库:
implementation 'com.squareup.okhttp:okhttp:2.7.5'
implementation 'com.squareup.okio:okio:1.11.0'
另外在AndroidManifest.xml中允许设备联网:
<uses-permission android:name="android.permission.INTERNET" />
①异步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<back_imageBean>) msg.obj); //注意这个方法!!!,这样才能赋值!!
break;
//myphotoUrlList = (List<back_imageBean>) msg.obj; //这个方法无法将数据传给myphotoUrlList!!!
case SONG_NAME_LIST:
mySongNameList.addAll((List<String>) msg.obj);
break;
case SINGER_NAME_LIST:
mySingerNameList.addAll((List<String>) 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<String> 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);
}
});*/
}
}
});
}
}