├── .gitignore ├── .idea ├── dictionaries │ └── Administrator.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── rxjava_retrofit │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── rxjava_retrofit │ │ │ ├── Api.java │ │ │ ├── Data.java │ │ │ ├── Info.java │ │ │ ├── MainActivity.java │ │ │ └── Translation.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── rxjava_retrofit │ └── ExampleUnitTest.java ├── build.gradle ├── data1.js ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── okhttp3demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── okhttp3demo │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── okhttp3demo │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── okhttp3demo │ └── ExampleUnitTest.java ├── rxjava2demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── rxjava2demo │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── rxjava2demo │ │ │ ├── Goods.java │ │ │ ├── MainActivity.java │ │ │ ├── RxJavaActivity02.java │ │ │ ├── RxJavaActivity03.java │ │ │ └── RxJavaActivity04.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_rxjava02.xml │ │ ├── activity_rxjava03.xml │ │ └── activity_rxjava04.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── rxjava2demo │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | #built application files 2 | *.apk 3 | *.ap_ 4 | 5 | 6 | # files for the dex VM 7 | *.dex 8 | 9 | 10 | # Java class files 11 | *.class 12 | 13 | 14 | # generated files 15 | bin/ 16 | gen/ 17 | 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | 23 | # Windows thumbnail db 24 | Thumbs.db 25 | 26 | 27 | # OSX files 28 | .DS_Store 29 | 30 | 31 | # Eclipse project files 32 | .classpath 33 | .project 34 | 35 | 36 | # Android Studio 37 | .idea 38 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. 39 | .gradle 40 | build/ 41 | 42 | 43 | # Signing files 44 | .signing/ 45 | 46 | 47 | # User-specific configurations 48 | .idea/libraries/ 49 | .idea/workspace.xml 50 | .idea/tasks.xml 51 | .idea/.name 52 | .idea/compiler.xml 53 | .idea/copyright/profiles_settings.xml 54 | .idea/encodings.xml 55 | .idea/misc.xml 56 | .idea/modules.xml 57 | .idea/scopes/scope_settings.xml 58 | .idea/vcs.xml 59 | *.iml -------------------------------------------------------------------------------- /.idea/dictionaries/Administrator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.example.rxjava_retrofit" 7 | minSdkVersion 15 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(include: ['*.jar'], dir: 'libs') 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | 29 | /*步骤二:添加retrofit依赖库*/ 30 | implementation 'com.squareup.retrofit2:retrofit:2.5.0' 31 | implementation 'com.squareup.retrofit2:converter-gson:2.0.2' 32 | } 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/rxjava_retrofit/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.rxjava_retrofit", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/rxjava_retrofit/Api.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | import java.util.Map; 4 | 5 | import okhttp3.MultipartBody; 6 | import okhttp3.RequestBody; 7 | import okhttp3.ResponseBody; 8 | import retrofit2.Call; 9 | import retrofit2.http.Body; 10 | import retrofit2.http.Field; 11 | import retrofit2.http.FieldMap; 12 | import retrofit2.http.FormUrlEncoded; 13 | import retrofit2.http.GET; 14 | import retrofit2.http.HTTP; 15 | import retrofit2.http.Header; 16 | import retrofit2.http.Headers; 17 | import retrofit2.http.Multipart; 18 | import retrofit2.http.POST; 19 | import retrofit2.http.Part; 20 | import retrofit2.http.PartMap; 21 | import retrofit2.http.Path; 22 | import retrofit2.http.Query; 23 | import retrofit2.http.QueryMap; 24 | import retrofit2.http.Streaming; 25 | import retrofit2.http.Url; 26 | 27 | /** 28 | * @创建者 mingyan.su 29 | * @创建时间 2019/5/31 17:44 30 | * @类描述 ${TODO}步骤四:创建网络接口类(封装Url地址和网络数据请求) 31 | */ 32 | public interface Api { 33 | //这里特别说明Url的组成,retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置, 34 | //第二部分在网络接口注解中设置,如下面的"/user",网络请求的完整地址Url = Retrofit实例.baseUrl()+网络请求接口注解() 35 | 36 | 37 | //1.get请求 38 | 39 | //(无参数) 40 | //get请求网络方法,需要在方法头部添加@GET注解,表示采用get方法访问网络请求,括号内的是请求的地址(Url的一部分) 41 | //其中返回类型是Call<*>,*表示接收数据的类,如果想直接获取ResponseBody中的内容,可以定义网络请求返回值为Call, 42 | //ResponseBody是请求网络后返回的原始数据,如果网络请求没有参数,不用写 43 | @GET("user") 44 | Call getData1(); 45 | 46 | //(有参数) 47 | //get请求网络方法,添加参数在方法括号内添加@Query,后面是参数类型和参数字段,其实就是键值对,Retrofit会把两个字段拼接到接口中 48 | //表示后面idLon的取值作为"id"的值,nameStr的取值作为"name"的值 49 | @GET("user") 50 | Call getData2(@Query("id") long idLon, @Query("name") String nameStr); 51 | 52 | //(多个不指定参数) 53 | //如果有多个不确定的参数可以使用@QueryMap注解,通过将参数传入Map中,再统一提交参数,类似多个Query 54 | @GET("user") 55 | Call getData3(@QueryMap Map map); 56 | 57 | 58 | //2.post请求(无参数) 59 | 60 | //(无参数) 61 | //post请求网络方法,需要在方法头部添加@POST注解,表示采用post方法访问网络请求 62 | @POST("user/emails") 63 | Call getPostData(); 64 | 65 | //(有参数) 66 | //如果有参数需要在头部添加@FormUrlEncoded注解,表示请求实体是一个From表单,每个键值对需要使用@File注解 67 | //在方法括号内使用@Field添加参数,这是发送Post请求时,提交请求的表单字段,必须要添加的,而且需要配合@FormUrlEncoded使用 68 | @FormUrlEncoded 69 | @POST("user/emails") 70 | Call getPostData2(@Field("name") String nameStr, @Field("sex") String sexStr); 71 | 72 | //(多个参数) 73 | //@FieldMap与@Field的作用一致,可以用于添加多个不确定的参数,类似@QueryMap,Map的key作为表单的键,Map的value作为表单的值 74 | @FormUrlEncoded 75 | @POST("user/emails") 76 | Call getPostData3(@FieldMap Map map); 77 | 78 | //@Body可以传递自定义类型数据给服务器,多用于post请求发送非表单数据,比如用传递Json格式数据,它可以注解很多东西,比如HashMap、实体类等 79 | //特别注意:@Body注解不能用于表单或者支持文件上传的表单的编码,即不能与@FormUrlEncoded和@Multipart注解同时使用,否则会报错 80 | @POST("user/emails") 81 | Call getPsotDataBody(@Body RequestBody body); 82 | 83 | //3.http 84 | //@HTTP注解是替换@GET、@POST、@PUT、@DELETE、@HEAD以及更多拓展功能 85 | //method:表示请求的方法,区分大小写,这里的值retrofit不会再做任何处理,必须要保证正确 86 | //path:网络请求地址路径 87 | //hasBody:是否有请求体 88 | @HTTP(method = "GET", path = "user/keys", hasBody = false) 89 | Call getHttpData(); 90 | 91 | //4.path 92 | //@Path注解用于Url中的占位符{},所有在网址中的参数,如下面的id,通过{}占位符来标记id,通过使用@Path注解传入id的值 93 | //注意有的Url既有占位符又有"?"后面的键值对,其实@Query和@Path两者是可以共用的 94 | @GET("orgs/{id}") 95 | Call getPathData(@Query("name") String nameStr, @Path("id") long idLon); 96 | 97 | //5.URl 98 | //@URL注解表示指定请求路径,如果需要重新地址接口地址,可以使用@URL,将地址以参数的形式传入即可。 99 | //如果有@Url注解时,GET传入的Url可以省略 100 | @GET 101 | Call getUrlData(@Url String nameStr, @Query("id") long idLon); 102 | 103 | //6.@Header和@Headers 104 | 105 | //@Header添加固定的请求头 106 | //作为方法的参数传入,用于添加不固定的header,该注解会更新已有的请求头 107 | @GET("user/emails") 108 | Call getHeaderData(@Header("token") String token); 109 | 110 | //@Headers添加多个请求头 111 | //用于添加固定请求头,可以同时添加多个,通过该注解添加的请求头不会相互覆盖,而是共同存在 112 | @Headers({"phone-type:android", "version:1.1.1"}) 113 | @GET("user/emails") 114 | Call getHeadersData(@Header("token") String token); 115 | 116 | //7.@Streaming 117 | //表示响应体的数据用流的方式返回,使用于返回数据比较大,该注解在下载大文件时特别有用 118 | @Streaming 119 | @POST("gists/public") 120 | Call getStreamingBig(); 121 | 122 | 123 | //8.@Multipart、@part、@PartMap 124 | //@Multipart表示请求实体是一个支持文件上传的表单,需要配合@Part和@PartMap使用,适用于文件上传 125 | //@Part用于表单字段,适用于文件上传的情况,@PartMap用于表单字段,可用于多文件上传的情况 126 | //@Part支持三种类型:RequestBody、MultipartBody.Part、任意类型 127 | @Multipart 128 | @POST("user/followers") 129 | Call getPartData(@Part("name") RequestBody name, @Part MultipartBody.Part file); 130 | 131 | //多文件上传 132 | @Multipart 133 | @POST("user/followers") 134 | Call getPartMapData(@PartMap Map map); 135 | 136 | //9.实例 137 | //get请求 138 | @GET("api/rand.music") 139 | Call> getJsonData(@Query("sort") String sort, @Query("format") String format); 140 | 141 | //post请求 142 | @FormUrlEncoded 143 | @POST("api/comments.163") 144 | Call postDataCall(@Field("format") String format); 145 | 146 | } 147 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/rxjava_retrofit/Data.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | /** 4 | * @创建者 mingyan.su 5 | * @创建时间 2019/5/31 18:16 6 | * @类描述 ${TODO}步骤三:回调数据统一封装类 7 | */ 8 | public class Data { 9 | private int code; 10 | private String message; 11 | private T data; 12 | 13 | public int getCode() { 14 | return code; 15 | } 16 | 17 | public void setCode(int code) { 18 | this.code = code; 19 | } 20 | 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | 29 | public T getData() { 30 | return data; 31 | } 32 | 33 | public void setData(T data) { 34 | this.data = data; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/rxjava_retrofit/Info.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | /** 4 | * @创建者 mingyan.su 5 | * @创建时间 2019/6/4 17:58 6 | * @类描述 ${TODO} 7 | */ 8 | public class Info { 9 | 10 | private String name; 11 | private String url; 12 | private String picurl; 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public void setName(String name) { 19 | this.name = name; 20 | } 21 | 22 | public String getUrl() { 23 | return url; 24 | } 25 | 26 | public void setUrl(String url) { 27 | this.url = url; 28 | } 29 | 30 | public String getPicurl() { 31 | return picurl; 32 | } 33 | 34 | public void setPicurl(String picurl) { 35 | this.picurl = picurl; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/rxjava_retrofit/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.util.Log; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | import android.widget.Toast; 9 | 10 | import java.io.File; 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | import okhttp3.FormBody; 15 | import okhttp3.MediaType; 16 | import okhttp3.MultipartBody; 17 | import okhttp3.RequestBody; 18 | import okhttp3.ResponseBody; 19 | import retrofit2.Call; 20 | import retrofit2.Callback; 21 | import retrofit2.Response; 22 | import retrofit2.Retrofit; 23 | import retrofit2.converter.gson.GsonConverterFactory; 24 | 25 | /** 26 | * Retrofit的简单使用 27 | * 我的博客:https://blog.csdn.net/m0_37796683/article/details/90702095 28 | */ 29 | public class MainActivity extends AppCompatActivity { 30 | private static final String TAG = MainActivity.class.getSimpleName(); 31 | private TextView mTextView; 32 | private Retrofit mRetrofit; 33 | 34 | /** 35 | * @param savedInstanceState 36 | */ 37 | @Override 38 | protected void onCreate(Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | setContentView(R.layout.activity_main); 41 | mTextView = findViewById(R.id.tv); 42 | 43 | ////步骤4:构建Retrofit实例 44 | mRetrofit = new Retrofit.Builder() 45 | //设置网络请求BaseUrl地址 46 | .baseUrl("https://api.uomg.com/") 47 | //设置数据解析器 48 | .addConverterFactory(GsonConverterFactory.create()) 49 | .build(); 50 | 51 | // getData3Call(retrofit); 52 | 53 | // partDataCall(retrofit); 54 | 55 | // partMapDataCall(retrofit); 56 | 57 | findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { 58 | @Override 59 | public void onClick(View v) { 60 | getJsonData(); 61 | } 62 | }); 63 | 64 | findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { 65 | @Override 66 | public void onClick(View v) { 67 | postJsonData(); 68 | } 69 | }); 70 | } 71 | 72 | /** 73 | * 示例,get加载Json数据 74 | */ 75 | private void getJsonData() { 76 | // 步骤5:创建网络请求接口对象实例 77 | Api api = mRetrofit.create(Api.class); 78 | //步骤6:对发送请求进行封装,传入接口参数 79 | Call> jsonDataCall = api.getJsonData("新歌榜", "json"); 80 | 81 | //同步执行 82 | // Response> execute = jsonDataCall.execute(); 83 | 84 | //步骤7:发送网络请求(异步) 85 | Log.e(TAG, "get == url:" + jsonDataCall.request().url()); 86 | jsonDataCall.enqueue(new Callback>() { 87 | @Override 88 | public void onResponse(Call> call, Response> response) { 89 | //步骤8:请求处理,输出结果 90 | Toast.makeText(MainActivity.this, "get回调成功:异步执行", Toast.LENGTH_SHORT).show(); 91 | Data body = response.body(); 92 | if (body == null) return; 93 | Info info = body.getData(); 94 | if (info == null) return; 95 | mTextView.setText("返回的数据:" + "\n\n" + info.getName() + "\n" + info.getPicurl()); 96 | } 97 | 98 | @Override 99 | public void onFailure(Call> call, Throwable t) { 100 | Log.e(TAG, "get回调失败:" + t.getMessage() + "," + t.toString()); 101 | Toast.makeText(MainActivity.this, "get回调失败", Toast.LENGTH_SHORT).show(); 102 | } 103 | }); 104 | } 105 | 106 | /** 107 | * 示例,Post加载Json数据 108 | */ 109 | private void postJsonData() { 110 | //步骤4:创建Retrofit对象 111 | Retrofit retrofit = new Retrofit.Builder() 112 | .baseUrl("https://api.uomg.com/") // 设置网络请求baseUrl 113 | .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析 114 | .build(); 115 | 116 | // 步骤5:创建网络请求接口的实例 117 | Api request = retrofit.create(Api.class); 118 | //步骤6:对发送请求进行封装:传入参数 119 | Call call = request.postDataCall("JSON"); 120 | 121 | //步骤7:发送网络请求(异步) 122 | 123 | //请求地址 124 | Log.e(TAG, "post == url:" + call.request().url()); 125 | 126 | //请求参数 127 | StringBuilder sb = new StringBuilder(); 128 | if (call.request().body() instanceof FormBody) { 129 | FormBody body = (FormBody) call.request().body(); 130 | for (int i = 0; i < body.size(); i++) { 131 | sb.append(body.encodedName(i)) 132 | .append(" = ") 133 | .append(body.encodedValue(i)) 134 | .append(","); 135 | } 136 | sb.delete(sb.length() - 1, sb.length()); 137 | Log.e(TAG, "| RequestParams:{" + sb.toString() + "}"); 138 | } 139 | 140 | call.enqueue(new Callback() { 141 | //请求成功时回调 142 | @Override 143 | public void onResponse(Call call, Response response) { 144 | //步骤8:请求处理,输出结果 145 | Object body = response.body(); 146 | if (body == null) return; 147 | mTextView.setText("返回的数据:" + "\n\n" + response.body().toString()); 148 | Toast.makeText(MainActivity.this, "post回调成功:异步执行", Toast.LENGTH_SHORT).show(); 149 | } 150 | 151 | //请求失败时回调 152 | @Override 153 | public void onFailure(Call call, Throwable throwable) { 154 | Log.e(TAG, "post回调失败:" + throwable.getMessage() + "," + throwable.toString()); 155 | Toast.makeText(MainActivity.this, "post回调失败", Toast.LENGTH_SHORT).show(); 156 | } 157 | }); 158 | } 159 | 160 | /** 161 | * 多个文件上传 162 | * 163 | * @param retrofit 164 | */ 165 | private void partMapDataCall(Retrofit retrofit) { 166 | File file1 = new File("文件路径"); 167 | File file2 = new File("文件路径"); 168 | if (!file1.exists()) { 169 | file1.mkdir(); 170 | } 171 | if (!file2.exists()) { 172 | file2.mkdir(); 173 | } 174 | 175 | RequestBody requestBody1 = RequestBody.create(MediaType.parse("image/png"), file1); 176 | RequestBody requestBody2 = RequestBody.create(MediaType.parse("image/png"), file2); 177 | MultipartBody.Part filePart1 = MultipartBody.Part.createFormData("file1", file1.getName(), requestBody1); 178 | MultipartBody.Part filePart2 = MultipartBody.Part.createFormData("file2", file2.getName(), requestBody2); 179 | 180 | Map mapPart = new HashMap<>(); 181 | mapPart.put("file1", filePart1); 182 | mapPart.put("file2", filePart2); 183 | 184 | Call partMapDataCall = retrofit.create(Api.class).getPartMapData(mapPart); 185 | } 186 | 187 | /** 188 | * 图文上传 189 | * 190 | * @param retrofit 191 | */ 192 | private void partDataCall(Retrofit retrofit) { 193 | //声明类型,这里是文字类型 194 | MediaType textType = MediaType.parse("text/plain"); 195 | //根据声明的类型创建RequestBody,就是转化为RequestBody对象 196 | RequestBody name = RequestBody.create(textType, "这里是你需要写入的文本:刘亦菲"); 197 | 198 | //创建文件,这里演示图片上传 199 | File file = new File("文件路径"); 200 | if (!file.exists()) { 201 | file.mkdir(); 202 | } 203 | 204 | //将文件转化为RequestBody对象 205 | //需要在表单中进行文件上传时,就需要使用该格式:multipart/form-data 206 | RequestBody imgBody = RequestBody.create(MediaType.parse("image/png"), file); 207 | //将文件转化为MultipartBody.Part 208 | //第一个参数:上传文件的key;第二个参数:文件名;第三个参数:RequestBody对象 209 | MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), imgBody); 210 | 211 | Call partDataCall = retrofit.create(Api.class).getPartData(name, filePart); 212 | } 213 | 214 | /** 215 | * get请求 216 | * 217 | * @param retrofit 218 | */ 219 | private void getData3Call(Retrofit retrofit) { 220 | Map map = new HashMap<>(); 221 | map.put("id", 10006); 222 | map.put("name", "刘亦菲"); 223 | Call getData3call = retrofit.create(Api.class).getData3(map); 224 | 225 | map.put("name", "刘亦菲"); 226 | map.put("sex", "女"); 227 | Call postData3 = retrofit.create(Api.class).getPostData3(map); 228 | } 229 | 230 | /** 231 | * post请求 232 | * 233 | * @param retrofit 234 | */ 235 | private void getPostData3(Retrofit retrofit) { 236 | Map map = new HashMap<>(); 237 | 238 | map.put("name", "刘亦菲"); 239 | map.put("sex", "女"); 240 | Call postData3 = retrofit.create(Api.class).getPostData3(map); 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/rxjava_retrofit/Translation.java: -------------------------------------------------------------------------------- 1 | package com.example.rxjava_retrofit; 2 | 3 | import java.util.List; 4 | 5 | public class Translation { 6 | 7 | private String type; 8 | private int errorCode; 9 | private int elapsedTime; 10 | private List> translateResult; 11 | 12 | public String getType() { 13 | return type; 14 | } 15 | 16 | public void setType(String type) { 17 | this.type = type; 18 | } 19 | 20 | public int getErrorCode() { 21 | return errorCode; 22 | } 23 | 24 | public void setErrorCode(int errorCode) { 25 | this.errorCode = errorCode; 26 | } 27 | 28 | public int getElapsedTime() { 29 | return elapsedTime; 30 | } 31 | 32 | public void setElapsedTime(int elapsedTime) { 33 | this.elapsedTime = elapsedTime; 34 | } 35 | 36 | public List> getTranslateResult() { 37 | return translateResult; 38 | } 39 | 40 | public void setTranslateResult(List> translateResult) { 41 | this.translateResult = translateResult; 42 | } 43 | 44 | public static class TranslateResultBean { 45 | 46 | public String src; 47 | public String tgt; 48 | 49 | public String getSrc() { 50 | return src; 51 | } 52 | 53 | public void setSrc(String src) { 54 | this.src = src; 55 | } 56 | 57 | public String getTgt() { 58 | return tgt; 59 | } 60 | 61 | public void setTgt(String tgt) { 62 | this.tgt = tgt; 63 | } 64 | } 65 | 66 | } 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 16 | 21 | 26 | 31 | 36 | 41 | 46 | 51 | 56 | 61 | 66 | 71 | 76 | 81 | 86 | 91 | 96 | 101 | 106 | 111 | 116 | 121 | 126 | 131 | 136 | 141 | 146 | 151 | 156 | 161 | 166 | 171 | 172 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |