package com.example.retrofitdemo;import java.util.Map;import okhttp3.MultipartBody;import okhttp3.RequestBody;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.http.Body;import retrofit2.http.Field;import retrofit2.http.FieldMap;import retrofit2.http.FormUrlEncoded;import retrofit2.http.GET;import retrofit2.http.Multipart;import retrofit2.http.POST;import retrofit2.http.Part;import retrofit2.http.Path;import retrofit2.http.Query;import retrofit2.http.QueryMap;import retrofit2.http.Streaming;import retrofit2.http.Url;/** * Created by 福气满满 on 2017/9/18. */public interface MyServerInterface { // 无参数 @GET("article/list/latest?page=1") Call<ResponseBody> getLatestJsonString(); // 有参数 @GET("article/list/{type}?") Call<MyBean> getLatestInfo(@Path("type") String type, @Query("page") int page); //get请求提交表单 @GET("MyWeb/RegServlet") Call<ResponseBody> getRegisterInfo(@QueryMap Map<String, String> map); @GET("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg") Call<ResponseBody> getNetworkData(); @GET Call<ResponseBody> getInfolist(@Url String urlstring); //访问网络,下载大文件,默认情况下,Retrofit在处理结果前会将服务器的Response全部读到内存,// 如果服务器返回的是一个非常大的文件,则容易造成oom @Streaming @GET Call<ResponseBody> getNetWorkBigFileAsync(@Url String urlstring);//post网络请求向服务器端提交form表单 @FormUrlEncoded//避免字符集编码引起的问题 @POST("http://172.16.45.50:8080/MyWebDemo/servlet/AServlet") Call<ResponseBody> postFormField(@Field("userName") String name,@Field("userPsw") String pwd); //post网络请求向服务器端提交form表单 @FormUrlEncoded//避免字符集编码引起的问题 @POST("MyWeb/RegServlet") Call<ResponseBody> postFormFieldMap(@FieldMap Map<String,String> map); //上传单个文件 @Multipart @POST("http://172.16.45.50:8080/MyWebDemo/servlet/BServlet") Call<ResponseBody> postUpLoadFile(@Part("uploadfile\";filename=\"cc.jpg") RequestBody responseBody); //上传多个文件 @POST("MyWeb/RegServlet") Call<ResponseBody> postUpLoadFiles(@Body MultipartBody multipartBody);}
package com.example.retrofitdemo; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.io.File; import java.io.IOException; import java.io.InputStream; import okhttp3.OkHttpClient; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView tv_result; private Call<MyBean> call; private Button btn_download_img; private ImageView im_bm; private MyServerInterface myServerInterface; private Button btn_download_big; private Call<ResponseBody> call_bm; private Context mContext; private Call<ResponseBody> call_big; private MyDownLoadReceiver receiver = null; private Button btn_register; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("TAG", "onCreate:" + Thread.currentThread().getId()); initView(); initRetrofit(); initReceiver(); } private void initReceiver() { receiver = new MyDownLoadReceiver(); registerReceiver(receiver, new IntentFilter("com.example.retrofitdemo")); } private void initRetrofit() { mContext = this; OkHttpClient okHttpClient = OkHttpUtils.getOkHttpClientByInstance(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.URL_BASE) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); myServerInterface = retrofit.create(MyServerInterface.class); // Call<ResponseBody> call = myServerInterface.getLatestJsonString(); // call.enqueue(new Callback<ResponseBody>() { // @Override // public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 主线程执行的 // Log.e("TAG", "onResponse: "+Thread.currentThread().getId() ); // if(response.isSuccess()){ // try { // String result = response.body().string(); // tv_result.setText(result); // } catch (IOException e) { // e.printStackTrace(); // } // } // } // // @Override // public void onFailure(Call<ResponseBody> call, Throwable t) { // // } // }); // call = myServerInterface.getLatestInfo("latest", 1); // call.enqueue(new Callback<MyBean>() { // @Override // public void onResponse(Call<MyBean> call, Response<MyBean> response) { // if (response.isSuccess()) { // List<MyBean.ItemsBean> list = response.body().getItems(); 设置适配器 // } // } // // @Override // public void onFailure(Call<MyBean> call, Throwable t) { // // } // }); } private void initView() { btn_register = (Button) findViewById(R.id.btn_register); tv_result = (TextView) findViewById(R.id.tv_result); btn_download_img = (Button) findViewById(R.id.btn_download_img); btn_download_img.setOnClickListener(this); im_bm = (ImageView) findViewById(R.id.im_bm); im_bm.setOnClickListener(this); btn_download_big = (Button) findViewById(R.id.btn_download_big); btn_download_big.setOnClickListener(this); btn_register.setOnClickListener(this); } @Override protected void onStop() { super.onStop(); if (call != null) { call.cancel(); } if (call_bm != null) { call_bm.cancel(); } if (call_big != null) { call_big.cancel(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_register: Intent intent = new Intent(this, RegisterActivity.class); startActivity(intent); break; case R.id.btn_download_img: call_bm = myServerInterface.getNetworkData(); call_bm.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccess()) { InputStream inputStream = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); im_bm.setImageBitmap(bitmap); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); break; case R.id.btn_download_big: // 因为下载的是大文件,一边下载一边保存,所以应该在子线程进行下载,进行保存 // Call<ResponseBody> call = myServerInterface.getNetWorkBigFileAsync(Constant.URL_VIDEO); // call.enqueue(new Callback<ResponseBody>() { // @Override // public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // String urlVideo = Constant.URL_VIDEO; 将下载后的文件存在sd卡 // String filename = urlVideo.substring(urlVideo.lastIndexOf("/") + 1); // try { // boolean flag = SDCardHelper.saveFileToSDCardPrivateCacheDir(response.body().bytes(), filename, mContext); // Toast.makeText(MainActivity.this, "下载结果:"+flag, Toast.LENGTH_SHORT).show(); // } catch (IOException e) { // e.printStackTrace(); // } // // } // // @Override // public void onFailure(Call<ResponseBody> call, Throwable t) { // // } // }); new Thread(new Runnable() { @Override public void run() { String urlVideo = Constant.URL_NETVIDEO; call_big = myServerInterface.getNetWorkBigFileAsync(Constant.URL_NETVIDEO); try { Response<ResponseBody> response = call_big.execute(); // 返回结果转换成流 InputStream inputStream = response.body().byteStream(); String filename = urlVideo.substring(urlVideo.lastIndexOf("/") + 1); boolean b = SDCardHelper.saveFileToSDCardPrivateCacheDir(inputStream, filename, mContext); Log.e("TAG", "run: ------Thread-------->" + b); if (b) { Intent intent = new Intent(); intent.setAction("com.example.retrofitdemo"); Bundle bundle = new Bundle(); String filepath = SDCardHelper.getSDCardPrivateCacheDir(mContext) + File.separator + filename; Log.e("TAG", "run: 保存的路径:"+filepath ); bundle.putString("path", filepath); intent.putExtras(bundle); sendBroadcast(intent); } } catch (IOException e) { e.printStackTrace(); } } }).start(); break; } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } }