retrofit2 okhttp3 RxJava butterknife 示例
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
依赖
    //【retrofit2】
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    //【okhttp】
    compile 'com.squareup.okhttp3:okhttp:3.8.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
    compile 'com.squareup.okio:okio:1.13.0'
    //【butterknife】
    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    //【rxjava】
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.6'//【retrofit2】
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
//【okhttp】
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
compile 'com.squareup.okio:okio:1.13.0'
//【butterknife】
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//【rxjava】
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.6'
GitHubApi
public interface GitHubApi {
	@GET("repos/{owner}/{repo}/contributors")
	Call<ResponseBody> contributorsBySimpleGetCall(@Path("owner") String owner, @Path("repo") String repo);
	@GET("repos/{owner}/{repo}/contributors")
	Call<List<Contributor>> contributorsByAddConverterGetCall(@Path("owner") String owner, @Path("repo") String repo);
	@Headers({"Accept: application/vnd.github.v3.full+json", "User-Agent: RetrofitBean-Sample-App", "name:ljd"})
	@GET("repos/{owner}/{repo}/contributors")
	Call<List<Contributor>> contributorsAndAddHeader(@Path("owner") String owner, @Path("repo") String repo);
	@GET("search/repositories")
	Call<RetrofitBean> queryRetrofitByGetCall(@Query("q") String owner, @Query("since") String time, @Query("page") int page, @Query("per_page") int per_Page);
	@GET("search/repositories")
	Call<RetrofitBean> queryRetrofitByGetCallMap(@QueryMap Map<String, String> map);
	@GET("repos/{owner}/{repo}/contributors")
	Observable<List<Contributor>> contributorsByRxJava(@Path("owner") String owner, @Path("repo") String repo);
	@GET("users/{user}")
	Observable<User> userByRxJava(@Path("user") String user);
	@GET("/mobilesafe/shouji360/360safesis/360MobileSafe_6.2.3.1060.apk")
	Call<ResponseBody> retrofitDownload();
}public interface GitHubApi {
    @GET("repos/{owner}/{repo}/contributors")
    Call<ResponseBody> contributorsBySimpleGetCall(@Path("owner") String owner, @Path("repo") String repo);
    @GET("repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributorsByAddConverterGetCall(@Path("owner") String owner, @Path("repo") String repo);
    @Headers({"Accept: application/vnd.github.v3.full+json", "User-Agent: RetrofitBean-Sample-App", "name:ljd"})
    @GET("repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributorsAndAddHeader(@Path("owner") String owner, @Path("repo") String repo);
    @GET("search/repositories")
    Call<RetrofitBean> queryRetrofitByGetCall(@Query("q") String owner, @Query("since") String time, @Query("page") int page, @Query("per_page") int per_Page);
    @GET("search/repositories")
Call<RetrofitBean> queryRetrofitByGetCallMap(@QueryMap Map<String, String> map);
    @GET("repos/{owner}/{repo}/contributors")
    Observable<List<Contributor>> contributorsByRxJava(@Path("owner") String owner, @Path("repo") String repo);
    @GET("users/{user}")
    Observable<User> userByRxJava(@Path("user") String user);
    @GET("/mobilesafe/shouji360/360safesis/360MobileSafe_6.2.3.1060.apk")
Call<ResponseBody> retrofitDownload();
}
MainActivity
public class MainActivity extends ListActivity {
	private TextView tv;
	private static final String baseUrl = "https://api.github.com/";
	private static final String mUserName = "square";//哪个公司【square】
	private static final String mRepo = "retrofit";//哪个项目【retrofit】
	private CompositeSubscription mSubscriptions = new CompositeSubscription();
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		String[] array = {"1、简单完整演示retrofit的使用",
				"2、添加Gson转换器",
				"3、添加okHttp的日志拦截器Interceptor",
				"4、使用自己封装的API,演示@Headers",
				"5、演示同步请求",
				"6、演示@Query",
				"7、演示@QueryMap",
				"8、最简单、完整的retrofit+rxJava示例",
				"9、rxJava+retrofit增强",
				"10、演示文件下载",};
		tv = new TextView(this);// 将内容显示在TextView中
		tv.setTextColor(Color.BLUE);
		getListView().addFooterView(tv);
		setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>(Arrays.asList(array))));
	}
	@Override
	protected void onDestroy() {
		if (mSubscriptions != null) mSubscriptions.unsubscribe();
		super.onDestroy();
	}
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		switch (position + 1) {
			case 1://简单完整演示retrofit的使用
				requestGitHubContributorsSimple();
				break;
			case 2://添加Gson转换器
				requestGitHubContributorsByConverter();
				break;
			case 3://添加okHttp的日志拦截器Interceptor
				requestGitHubContributorsAddOkHttpLog();
				break;
			case 4://使用自己封装的API,演示@Headers
				requestGitHubContributorsAddHeader();
				break;
			case 5://演示同步请求
				requestGitHubContributorsBySync();
				break;
			case 6://演示@Query
				requestQueryRetrofitByGet(false);
				break;
			case 7://演示@QueryMap
				requestQueryRetrofitByGet(true);
				break;
			case 8://最简单、完整的retrofit+rxJava示例
				requestGitHubContributorsByRxJava();
				break;
			case 9://rxJava+retrofit增强
				requestGitHubContributorsWithFullUserInfo();
				break;
			case 10://演示文件下载
				retrofitDownload();
				break;
		}
	}
	/**
	 * 1、简单示例
	 */
	private void requestGitHubContributorsSimple() {
		Retrofit retrofit = new Retrofit.Builder()
				.baseUrl(baseUrl)
				.build();
		GitHubApi repo = retrofit.create(GitHubApi.class);
		Call<ResponseBody> call = repo.contributorsBySimpleGetCall(mUserName, mRepo);
		call.enqueue(new Callback<ResponseBody>() {
			@Override
			public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
				String result = null;
				try {
					result = response.body().string();
					if (result == null) return;
				} catch (IOException e) {
					e.printStackTrace();
				}
				tv.setText("GitHub上对项目的贡献-1:\n");
				ArrayList<Contributor> list = new Gson()
						.fromJson(result, new TypeToken<List<Contributor>>() {
						}.getType());
				if (list == null || list.size() == 0) return;
				for (Contributor contributor : list) {
					tv.append(contributor.login + "    " + contributor.contributions + "\n");
				}
			}
			@Override
			public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
				Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
			}
		});
	}
	/**
	 * 2、添加Gson转换器
	 */
	private void requestGitHubContributorsByConverter() {
		new Retrofit.Builder()
				.baseUrl(baseUrl)
				.addConverterFactory(GsonConverterFactory.create())//转换器
				.build()
				.create(GitHubApi.class)
				.contributorsByAddConverterGetCall(mUserName, mRepo)
				.enqueue(new Callback<List<Contributor>>() {
					@Override
					public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<Contributor>> response) {
						List<Contributor> list = response.body();
						tv.setText("GitHub上对项目的贡献-2:\n");
						if (list == null || list.size() == 0) return;
						for (Contributor contributor : list) {
							tv.append(contributor.login + "    " + contributor.contributions + "\n");
						}
					}
					@Override
					public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
						Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
					}
				});
	}
	/**
	 * 3、添加okHttp的日志拦截器Interceptor
	 */
	private void requestGitHubContributorsAddOkHttpLog() {
		HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
		Retrofit retrofit = new Retrofit.Builder()
				.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
				.client(new OkHttpClient.Builder().addInterceptor(logInterceptor).build())
				.baseUrl(baseUrl)
				.addConverterFactory(GsonConverterFactory.create())
				.build();
		retrofit.create(GitHubApi.class)
				.contributorsByAddConverterGetCall(mUserName, mRepo)
				.enqueue(new Callback<List<Contributor>>() {
					@Override
					public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<com.bqt
							.retrofit.bean.Contributor>> response) {
						List<Contributor> list = response.body();
						tv.setText("GitHub上对项目的贡献-3:\n");
						if (list == null || list.size() == 0) return;
						for (Contributor contributor : list) {
							tv.append(contributor.login + "    " + contributor.contributions + "\n");
						}
					}
					@Override
					public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
						Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
					}
				});
	}
	/**
	 * 4、使用自己封装的API,演示@Headers
	 */
	private void requestGitHubContributorsAddHeader() {
		createRetrofitService(GitHubApi.class)
				.contributorsAndAddHeader(mUserName, mRepo)
				.enqueue(new Callback<List<Contributor>>() {
					@Override
					public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<com.bqt
							.retrofit.bean.Contributor>> response) {
						List<Contributor> list = response.body();
						tv.setText("GitHub上对项目的贡献-4:\n");
						if (list == null || list.size() == 0) return;
						for (Contributor contributor : list) {
							tv.append(contributor.login + "    " + contributor.contributions + "\n");
						}
					}
					@Override
					public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
					}
				});
	}
	/**
	 * 5、演示同步请求
	 */
	private void requestGitHubContributorsBySync() {
		final Call<List<Contributor>> call = createRetrofitService(GitHubApi.class)
				.contributorsByAddConverterGetCall(mUserName, mRepo);
		new Thread(() -> {
			try {
				Response<List<Contributor>> response = call.execute();//在子线程中请求网络
				final List<Contributor> list = response.body();
				runOnUiThread(() -> {
					tv.setText("GitHub上对项目的贡献-5:\n");
					for (Contributor contributor : list) {
						tv.append(contributor.login + "    " + contributor.contributions + "\n");
					}
				});
			} catch (IOException e) {
				e.printStackTrace();
			}
		}).start();
	}
	/**
	 * 6/7、演示@Query和@QueryMap
	 */
	private void requestQueryRetrofitByGet(boolean isQueryMap) {
		GitHubApi mGitHubService = createRetrofitService(GitHubApi.class);
		Call<RetrofitBean> call;
		if (!isQueryMap) call = mGitHubService.queryRetrofitByGetCall("retrofit", "2016-03-29", 1, 3);
		else {
			Map<String, String> queryMap = new HashMap<>();
			queryMap.put("q", "retrofit");
			queryMap.put("since", "2016-03-29");
			queryMap.put("page", "1");
			queryMap.put("per_page", "3");
			call = mGitHubService.queryRetrofitByGetCallMap(queryMap);
		}
		call.enqueue(new Callback<RetrofitBean>() {
			@Override
			public void onResponse(@NonNull Call<RetrofitBean> call, @NonNull Response<RetrofitBean> response) {
				RetrofitBean retrofitBean = response.body();
				if (retrofitBean == null) return;
				List<Item> list = retrofitBean.getItems();
				if (list == null || list.size() == 0) return;
				tv.setText(new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date()));
				tv.append("\ntotal:" + retrofitBean.getTotalCount() + "\nincompleteResults:" + retrofitBean.getIncompleteResults());
				for (Item item : list) {
					tv.append("\n\n【name】" + item.name);
					tv.append("\n【full_name】" + item.full_name);
					tv.append("\n【 description】" + item.description);
				}
			}
			@Override
			public void onFailure(@NonNull Call<RetrofitBean> call, @NonNull Throwable t) {
			}
		});
	}
	/**
	 * 8、最简单、完整的retrofit+rxJava示例
	 */
	private void requestGitHubContributorsByRxJava() {
		createRetrofitService(GitHubApi.class)
				.contributorsByRxJava(mUserName, mRepo)//
				.subscribeOn(Schedulers.io())//
				.observeOn(AndroidSchedulers.mainThread())//
				.subscribe(new Observer<List<Contributor>>() {
					@Override
					public void onCompleted() {
						Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_SHORT).show();
					}
					@Override
					public void onError(Throwable e) {
						Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
					}
					@Override
					public void onNext(List<Contributor> list) {
						tv.setText("GitHub上对项目的贡献-8:\n");
						for (Contributor contributor : list) {
							tv.append(contributor.login + "    " + contributor.contributions + "\n");
						}
					}
				});
	}
	/**
	 * 9、rxJava+retrofit增强
	 */
	private void requestGitHubContributorsWithFullUserInfo() {
		tv.setText("");
		final GitHubApi mGitHubService = createRetrofitService(GitHubApi.class);
		Subscription subscription =
				mGitHubService.contributorsByRxJava(mUserName, mRepo)//
						.flatMap(new Func1<List<Contributor>, Observable<Contributor>>() {
							//变换:将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列
							@Override
							public Observable<Contributor> call(List<Contributor>
									                                    contributors) {
								//1、使用传入的事件对象创建一个 Observable 对象;
								//2、并不发送这个 Observable,而是将它激活,于是它开始发送事件;
								//3、创建的 Observable 发送的事件,都被汇入同一个 Observable,而这个 Observable 负责将这些事件统一交给Subscriber 的回调方法
								return Observable.from(contributors);
							}
						})
						.flatMap(new Func1<Contributor, Observable<Pair<User, Contributor>>>() {
							@Override
							public Observable<Pair<User, Contributor>> call(com.bqt
									                                                .retrofit.bean.Contributor contributor) {
								Observable<User> userObservable = mGitHubService.userByRxJava(contributor.login)
										.filter(user -> !isEmpty(user.name) && !isEmpty(user.email));
								return Observable.zip(userObservable, Observable.just(contributor), Pair::new);
							}
						})
						.subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在哪个线程,后台线程取数据,主线程显示
						.observeOn(AndroidSchedulers.mainThread())//指定 Subscriber 的回调发生在主线程
						.subscribe(new Observer<Pair<User, Contributor>>() {
							@Override
							public void onCompleted() {
								Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_SHORT).show();
							}
							@Override
							public void onError(Throwable e) {
								Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
							}
							@Override
							public void onNext(Pair<User, Contributor> pair) {
								User user = pair.first;
								Contributor contributor = pair.second;
								tv.append("name:" + user.name + "\ncontributions:" + contributor.contributions + "\nEmail:" + user.email + "\n\n");
							}
						});
		mSubscriptions.add(subscription);
	}
	/**
	 * 10、演示文件下载
	 */
	public void retrofitDownload() {
		//监听下载进度
		final ProgressDialog dialog = new ProgressDialog(this);
		dialog.setProgressNumberFormat("%1d KB/%2d KB");
		dialog.setTitle("下载");
		dialog.setMessage("正在下载,请稍后...");
		dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		dialog.setCancelable(false);
		dialog.show();
		ProgressHelper.setProgressHandler(new DownloadProgressHandler() {
			@Override
			protected void onProgress(long bytesRead, long contentLength, boolean done) {
				//在主线程中运行
				dialog.setMax((int) (contentLength / 1024));
				dialog.setProgress((int) (bytesRead / 1024));
				if (done) dialog.dismiss();
			}
		});
		Retrofit retrofit = new Retrofit.Builder()//
				.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//
				.addConverterFactory(GsonConverterFactory.create())//
				.baseUrl("http://msoftdl.360.cn")
				.client(ProgressHelper.addProgress(null).build())
				.build();
		retrofit.create(GitHubApi.class).retrofitDownload()
				.enqueue(new Callback<ResponseBody>() {
					@Override
					public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
						try {
							InputStream is = response.body().byteStream();
							File file = new File(Environment.getExternalStorageDirectory(), "12345.apk");
							FileOutputStream fos = new FileOutputStream(file);
							BufferedInputStream bis = new BufferedInputStream(is);
							byte[] buffer = new byte[1024];
							int len;
							while ((len = bis.read(buffer)) != -1) {
								fos.write(buffer, 0, len);
								fos.flush();
							}
							fos.close();
							bis.close();
							is.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
					@Override
					public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
					}
				});
	}
	public static <T> T createRetrofitService(final Class<T> service) {
		HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor()
            .setLevel(HttpLoggingInterceptor.Level.BODY);
		OkHttpClient.Builder builder = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor);
		Retrofit retrofit = new Retrofit.Builder()//
				.client(ProgressHelper.addProgress(builder).build())//
				.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//
				.addConverterFactory(GsonConverterFactory.create())//
				.baseUrl("https://api.github.com/")//
				.build();
		return retrofit.create(service);
	}
}public class MainActivity extends ListActivity {
private TextView tv;
private static final String baseUrl = "https://api.github.com/";
private static final String mUserName = "square";//哪个公司【square】
private static final String mRepo = "retrofit";//哪个项目【retrofit】
private CompositeSubscription mSubscriptions = new CompositeSubscription();
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        String[] array = {"1、简单完整演示retrofit的使用",
"2、添加Gson转换器",
"3、添加okHttp的日志拦截器Interceptor",
"4、使用自己封装的API,演示@Headers",
"5、演示同步请求",
"6、演示@Query",
"7、演示@QueryMap",
"8、最简单、完整的retrofit+rxJava示例",
"9、rxJava+retrofit增强",
"10、演示文件下载",};
tv = new TextView(this);// 将内容显示在TextView中
tv.setTextColor(Color.BLUE);
getListView().addFooterView(tv);
setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>(Arrays.asList(array))));
}
@Override
    protected void onDestroy() {
if (mSubscriptions != null) mSubscriptions.unsubscribe();
super.onDestroy();
}
@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position + 1) {
case 1://简单完整演示retrofit的使用
requestGitHubContributorsSimple();
break;
case 2://添加Gson转换器
requestGitHubContributorsByConverter();
break;
case 3://添加okHttp的日志拦截器Interceptor
requestGitHubContributorsAddOkHttpLog();
break;
case 4://使用自己封装的API,演示@Headers
requestGitHubContributorsAddHeader();
break;
case 5://演示同步请求
requestGitHubContributorsBySync();
break;
case 6://演示@Query
requestQueryRetrofitByGet(false);
break;
case 7://演示@QueryMap
requestQueryRetrofitByGet(true);
break;
case 8://最简单、完整的retrofit+rxJava示例
requestGitHubContributorsByRxJava();
break;
case 9://rxJava+retrofit增强
requestGitHubContributorsWithFullUserInfo();
break;
case 10://演示文件下载
retrofitDownload();
break;
}
}
/**
* 1、简单示例
*/
    private void requestGitHubContributorsSimple() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.build();
GitHubApi repo = retrofit.create(GitHubApi.class);
Call<ResponseBody> call = repo.contributorsBySimpleGetCall(mUserName, mRepo);
        call.enqueue(new Callback<ResponseBody>() {
@Override
            public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
String result = null;
                try {
result = response.body().string();
if (result == null) return;
                } catch (IOException e) {
e.printStackTrace();
}
                tv.setText("GitHub上对项目的贡献-1:\n");
ArrayList<Contributor> list = new Gson()
                        .fromJson(result, new TypeToken<List<Contributor>>() {
}.getType());
if (list == null || list.size() == 0) return;
                for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
}
@Override
            public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 2、添加Gson转换器
*/
    private void requestGitHubContributorsByConverter() {
new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())//转换器
.build()
.create(GitHubApi.class)
.contributorsByAddConverterGetCall(mUserName, mRepo)
                .enqueue(new Callback<List<Contributor>>() {
@Override
                    public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<Contributor>> response) {
List<Contributor> list = response.body();
                        tv.setText("GitHub上对项目的贡献-2:\n");
if (list == null || list.size() == 0) return;
                        for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
}
@Override
                    public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 3、添加okHttp的日志拦截器Interceptor
*/
    private void requestGitHubContributorsAddOkHttpLog() {
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(new OkHttpClient.Builder().addInterceptor(logInterceptor).build())
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
retrofit.create(GitHubApi.class)
.contributorsByAddConverterGetCall(mUserName, mRepo)
                .enqueue(new Callback<List<Contributor>>() {
@Override
public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<com.bqt
                            .retrofit.bean.Contributor>> response) {
List<Contributor> list = response.body();
                        tv.setText("GitHub上对项目的贡献-3:\n");
if (list == null || list.size() == 0) return;
                        for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
}
@Override
                    public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 4、使用自己封装的API,演示@Headers
*/
    private void requestGitHubContributorsAddHeader() {
createRetrofitService(GitHubApi.class)
.contributorsAndAddHeader(mUserName, mRepo)
                .enqueue(new Callback<List<Contributor>>() {
@Override
public void onResponse(@NonNull Call<List<Contributor>> call, @NonNull Response<List<com.bqt
                            .retrofit.bean.Contributor>> response) {
List<Contributor> list = response.body();
                        tv.setText("GitHub上对项目的贡献-4:\n");
if (list == null || list.size() == 0) return;
                        for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
}
@Override
                    public void onFailure(@NonNull Call<List<Contributor>> call, @NonNull Throwable t) {
}
});
}
/**
* 5、演示同步请求
*/
    private void requestGitHubContributorsBySync() {
final Call<List<Contributor>> call = createRetrofitService(GitHubApi.class)
.contributorsByAddConverterGetCall(mUserName, mRepo);
        new Thread(() -> {
            try {
Response<List<Contributor>> response = call.execute();//在子线程中请求网络
final List<Contributor> list = response.body();
                runOnUiThread(() -> {
                    tv.setText("GitHub上对项目的贡献-5:\n");
                    for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
});
            } catch (IOException e) {
e.printStackTrace();
}
}).start();
}
/**
* 6/7、演示@Query和@QueryMap
*/
    private void requestQueryRetrofitByGet(boolean isQueryMap) {
GitHubApi mGitHubService = createRetrofitService(GitHubApi.class);
Call<RetrofitBean> call;
        if (!isQueryMap) call = mGitHubService.queryRetrofitByGetCall("retrofit", "2016-03-29", 1, 3);
        else {
Map<String, String> queryMap = new HashMap<>();
            queryMap.put("q", "retrofit");
            queryMap.put("since", "2016-03-29");
            queryMap.put("page", "1");
            queryMap.put("per_page", "3");
call = mGitHubService.queryRetrofitByGetCallMap(queryMap);
}
        call.enqueue(new Callback<RetrofitBean>() {
@Override
            public void onResponse(@NonNull Call<RetrofitBean> call, @NonNull Response<RetrofitBean> response) {
RetrofitBean retrofitBean = response.body();
if (retrofitBean == null) return;
List<Item> list = retrofitBean.getItems();
if (list == null || list.size() == 0) return;
                tv.setText(new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date()));
                tv.append("\ntotal:" + retrofitBean.getTotalCount() + "\nincompleteResults:" + retrofitBean.getIncompleteResults());
                for (Item item : list) {
                    tv.append("\n\n【name】" + item.name);
                    tv.append("\n【full_name】" + item.full_name);
                    tv.append("\n【 description】" + item.description);
}
}
@Override
            public void onFailure(@NonNull Call<RetrofitBean> call, @NonNull Throwable t) {
}
});
}
/**
* 8、最简单、完整的retrofit+rxJava示例
*/
    private void requestGitHubContributorsByRxJava() {
createRetrofitService(GitHubApi.class)
.contributorsByRxJava(mUserName, mRepo)//
.subscribeOn(Schedulers.io())//
.observeOn(AndroidSchedulers.mainThread())//
                .subscribe(new Observer<List<Contributor>>() {
@Override
                    public void onCompleted() {
Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_SHORT).show();
}
@Override
                    public void onError(Throwable e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
                    public void onNext(List<Contributor> list) {
                        tv.setText("GitHub上对项目的贡献-8:\n");
                        for (Contributor contributor : list) {
tv.append(contributor.login + " " + contributor.contributions + "\n");
}
}
});
}
/**
* 9、rxJava+retrofit增强
*/
    private void requestGitHubContributorsWithFullUserInfo() {
        tv.setText("");
final GitHubApi mGitHubService = createRetrofitService(GitHubApi.class);
Subscription subscription =
mGitHubService.contributorsByRxJava(mUserName, mRepo)//
                        .flatMap(new Func1<List<Contributor>, Observable<Contributor>>() {
//变换:将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列
@Override
public Observable<Contributor> call(List<Contributor>
                                                                        contributors) {
//1、使用传入的事件对象创建一个 Observable 对象;
//2、并不发送这个 Observable,而是将它激活,于是它开始发送事件;
//3、创建的 Observable 发送的事件,都被汇入同一个 Observable,而这个 Observable 负责将这些事件统一交给Subscriber 的回调方法
return Observable.from(contributors);
}
})
                        .flatMap(new Func1<Contributor, Observable<Pair<User, Contributor>>>() {
@Override
public Observable<Pair<User, Contributor>> call(com.bqt
                                                                                    .retrofit.bean.Contributor contributor) {
Observable<User> userObservable = mGitHubService.userByRxJava(contributor.login)
.filter(user -> !isEmpty(user.name) && !isEmpty(user.email));
return Observable.zip(userObservable, Observable.just(contributor), Pair::new);
}
})
.subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在哪个线程,后台线程取数据,主线程显示
.observeOn(AndroidSchedulers.mainThread())//指定 Subscriber 的回调发生在主线程
                        .subscribe(new Observer<Pair<User, Contributor>>() {
@Override
                            public void onCompleted() {
Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_SHORT).show();
}
@Override
                            public void onError(Throwable e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
                            public void onNext(Pair<User, Contributor> pair) {
User user = pair.first;
Contributor contributor = pair.second;
                                tv.append("name:" + user.name + "\ncontributions:" + contributor.contributions + "\nEmail:" + user.email + "\n\n");
}
});
mSubscriptions.add(subscription);
}
/**
* 10、演示文件下载
*/
    public void retrofitDownload() {
//监听下载进度
final ProgressDialog dialog = new ProgressDialog(this);
        dialog.setProgressNumberFormat("%1d KB/%2d KB");
        dialog.setTitle("下载");
        dialog.setMessage("正在下载,请稍后...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.show();
        ProgressHelper.setProgressHandler(new DownloadProgressHandler() {
@Override
            protected void onProgress(long bytesRead, long contentLength, boolean done) {
//在主线程中运行
dialog.setMax((int) (contentLength / 1024));
dialog.setProgress((int) (bytesRead / 1024));
if (done) dialog.dismiss();
}
});
Retrofit retrofit = new Retrofit.Builder()//
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//
.addConverterFactory(GsonConverterFactory.create())//
                .baseUrl("http://msoftdl.360.cn")
.client(ProgressHelper.addProgress(null).build())
.build();
retrofit.create(GitHubApi.class).retrofitDownload()
                .enqueue(new Callback<ResponseBody>() {
@Override
                    public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
                        try {
InputStream is = response.body().byteStream();
File file = new File(Environment.getExternalStorageDirectory(), "12345.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
                            while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
fos.close();
bis.close();
is.close();
                        } catch (IOException e) {
e.printStackTrace();
}
}
@Override
                    public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
}
});
}
    public static <T> T createRetrofitService(final Class<T> service) {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor);
Retrofit retrofit = new Retrofit.Builder()//
.client(ProgressHelper.addProgress(builder).build())//
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//
.addConverterFactory(GsonConverterFactory.create())//
                .baseUrl("https://api.github.com/")//
.build();
return retrofit.create(service);
}
}
综合配置
public class H {
	private static Interceptor buildInterceptor() {
		final String token = AccountManager.getInstance().getToken();
		PackageInfo packInfo = null;
		try {
			packInfo = App.app.getPackageManager().getPackageInfo(App.app.getPackageName(), 0);
		} catch (PackageManager.NameNotFoundException e) {
			e.printStackTrace();
		}
		final int version = packInfo == null ? 1 : packInfo.versionCode;
		return new Interceptor() {//应用程序拦截器,只被调用一次
			@Override
			public okhttp3.Response intercept(Chain chain) throws IOException {
				Request request = chain.request()
						.newBuilder()
						.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
						.addHeader("Accept-Encoding", "gzip, deflate")
						.addHeader("Connection", "keep-alive")
						.addHeader("Accept", "*/*")
						//****************************************自定义Header**************************************************
						.addHeader("version", version + "")//app版本号
						.addHeader("token", token == null ? "" : token)//登录后返回的token
						.addHeader("mobile", "1")// 0-PC,1-Android,2-IOS,3-web
						.build();
				return chain.proceed(request);
			}
		};
	}
	private static Interceptor buildLogInterceptor() {
		return new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
			@Override
			public void log(String message) {
				L.i(message);
			}
		}).setLevel(HttpLoggingInterceptor.Level.BODY);//日志显示级别
	}
	private static OkHttpClient buildOkHttp() {
		return new OkHttpClient.Builder()
				.addInterceptor(buildHeaderInterceptor())//自定义Header
				.addInterceptor(buildLogInterceptor())//日志拦截
                .connectTimeout(5, TimeUnit.SECONDS)
				.build();
	}
	private static Gson buildGson() {
		return new GsonBuilder()//配置你的Gson
				.setDateFormat("yyyy-MM-dd hh:mm:ss")
				.setPrettyPrinting()
				.serializeNulls()
				.create();
	}
	private static String buildBaseUrl() {
		switch (UrlHelper.getEnv()) {
			case 0: // baseUlr 必须以 / 结束,不然会抛出一个IllegalArgumentException
				return "http://test.talk.99cj.com.cn/";
			case 1:
				return "http://wechat.99cj.com.cn/";
			default:
				return "http://wechat.99cj.com.cn/";
		}
	}
	private static Retrofit buildRetrofit(OkHttpClient client, Converter.Factory converterFactory, CallAdapter.Factory callAdapterFactory) {
		return new Retrofit.Builder()
				.baseUrl(buildBaseUrl())
				.client(client)
				.addConverterFactory(converterFactory)//可以接收自定义的Gson,当然也可以不传
				.addCallAdapterFactory(callAdapterFactory)
				.build();
	}
	private static <T> T createRetrofitService(final Class<T> service) {
		Retrofit retrofit = buildRetrofit(buildOkHttp(), //
				GsonConverterFactory.create(buildGson()),//
				RxJavaCallAdapterFactory.create());//
		return retrofit.create(service);
	}
	public static BqtService h() {
		return createRetrofitService(BqtService.class);
	}
}x
public class H {
    private static Interceptor buildInterceptor() {
final String token = AccountManager.getInstance().getToken();
PackageInfo packInfo = null;
        try {
packInfo = App.app.getPackageManager().getPackageInfo(App.app.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
final int version = packInfo == null ? 1 : packInfo.versionCode;
        return new Interceptor() {//应用程序拦截器,只被调用一次
@Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
                        .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                        .addHeader("Accept-Encoding", "gzip, deflate")
                        .addHeader("Connection", "keep-alive")
                        .addHeader("Accept", "*/*")
//****************************************自定义Header**************************************************
                        .addHeader("version", version + "")//app版本号
                        .addHeader("token", token == null ? "" : token)//登录后返回的token
                        .addHeader("mobile", "1")// 0-PC,1-Android,2-IOS,3-web
.build();
return chain.proceed(request);
}
};
}
    private static Interceptor buildLogInterceptor() {
        return new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
            public void log(String message) {
L.i(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);//日志显示级别
}
    private static OkHttpClient buildOkHttp() {
return new OkHttpClient.Builder()
.addInterceptor(buildHeaderInterceptor())//自定义Header
.addInterceptor(buildLogInterceptor())//日志拦截
.connectTimeout(5, TimeUnit.SECONDS)
.build();
}
    private static Gson buildGson() {
return new GsonBuilder()//配置你的Gson
                .setDateFormat("yyyy-MM-dd hh:mm:ss")
.setPrettyPrinting()
.serializeNulls()
.create();
}
    private static String buildBaseUrl() {
        switch (UrlHelper.getEnv()) {
case 0: // baseUlr 必须以 / 结束,不然会抛出一个IllegalArgumentException
return "http://test.talk.99cj.com.cn/";
case 1:
return "http://wechat.99cj.com.cn/";
default:
return "http://wechat.99cj.com.cn/";
}
}
    private static Retrofit buildRetrofit(OkHttpClient client, Converter.Factory converterFactory, CallAdapter.Factory callAdapterFactory) {
return new Retrofit.Builder()
.baseUrl(buildBaseUrl())
.client(client)
.addConverterFactory(converterFactory)//可以接收自定义的Gson,当然也可以不传
.addCallAdapterFactory(callAdapterFactory)
.build();
}
    private static <T> T createRetrofitService(final Class<T> service) {
Retrofit retrofit = buildRetrofit(buildOkHttp(), //
GsonConverterFactory.create(buildGson()),//
RxJavaCallAdapterFactory.create());//
return retrofit.create(service);
}
    public static BqtService h() {
return createRetrofitService(BqtService.class);
}
}
 
public interface BqtService {
	/*个人中心*/  /* 如果注解中提供的url是完整的url(以http开头),则忽略baseUrl,直接讲此url将作为请求的url */
	@GET("User") /* 如果不以/开头,则请求的url为baseUrl+注解中提供的值;否则请求的url为baseUrl的主机部分+注解中提供的值*/
	Observable<BqtRes<User>> getUser();
	/*用户购买记录*/
	@FormUrlEncoded
	@POST("BuyInfo/buyRecord")	/*【type】1:购买课程 2:购买观点 3:直播赞赏*/
	Observable<BqtRes<ArrayList<MyClassBean>>> getPurchaseHistory1(@Field("user_id") int uid, @Field("page") int page, @Field("type") int type);
}public interface BqtService {
/*个人中心*/ /* 如果注解中提供的url是完整的url(以http开头),则忽略baseUrl,直接讲此url将作为请求的url */
    @GET("User") /* 如果不以/开头,则请求的url为baseUrl+注解中提供的值;否则请求的url为baseUrl的主机部分+注解中提供的值*/
Observable<BqtRes<User>> getUser();
/*用户购买记录*/
@FormUrlEncoded
    @POST("BuyInfo/buyRecord")  /*【type】1:购买课程 2:购买观点 3:直播赞赏*/
    Observable<BqtRes<ArrayList<MyClassBean>>> getPurchaseHistory1(@Field("user_id") int uid, @Field("page") int page, @Field("type") int type);
}
H.h().getUser()
	.subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在哪个线程,后台线程取数据,主线程显示
	.observeOn(AndroidSchedulers.mainThread())//指定 Subscriber 的回调发生在主线程
	.subscribe(new Subscriber<BqtRes<User>>() {
		@Override
		public void onCompleted() {
		}
		@Override
		public void onError(Throwable e) {
			L.i("【onError】" + e.toString());
		}
		@Override
		public void onNext(BqtRes<User> response) {
			L.i("【onNext】" + response.data.toString());//这里response.data的类型即是User
		}
	});H.h().getUser()
.subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在哪个线程,后台线程取数据,主线程显示
.observeOn(AndroidSchedulers.mainThread())//指定 Subscriber 的回调发生在主线程
    .subscribe(new Subscriber<BqtRes<User>>() {
@Override
        public void onCompleted() {
}
@Override
        public void onError(Throwable e) {
            L.i("【onError】" + e.toString());
}
@Override
        public void onNext(BqtRes<User> response) {
            L.i("【onNext】" + response.data.toString());//这里response.data的类型即是User
}
});
附件列表
retrofit2 okhttp3 RxJava butterknife 示例的更多相关文章
- Rxjava+Retrofit2+Okhttp3多文件上传(服务器端代码+客户端代码)
		所有代码亲测可用,如有问题,欢迎指正. 首先在ApiService接口文件中新建文件上传接口 public interface ApiService { static final String BAS ... 
- [Android] Android RxJava2+Retrofit2+OkHttp3 的使用
		[Android] Android RxJava2+Retrofit2+OkHttp3 简单介绍Retrofit.OKHttp和RxJava之间的关系: Retrofit:Retrofit是Squar ... 
- Retrofit2与RxJava用法大全
		Retrofit2是square公司出品的一个网络请求库,网上有很多相关的介绍.我很久以前都想去研究了,但一直都有各种事情耽搁,现在就让我们一起去捋一捋,这篇主要讲解Retrofit2与RxJava的 ... 
- Retrofit2.0+RxJava+Dragger2实现不一样的Android网络架构搭建
		Tamic :csdn http://blog.csdn.net/sk719887916 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框 ... 
- Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)
		csdn :码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51958010 RetrofitClient 基于Retrofit2 ... 
- 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)
		转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ... 
- [Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用
		本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用 本文的目标是用 Retrofit写一个网络请求: 本文以从获取天气预报 ... 
- Retrofit2 + OkHttp3设置Http请求头(Headers)方法汇总
		在构建网络层时会遇到一个问题就是要手动配置Http请求的Headers,写入缓存Cookie,自定义的User-Agent等参数,但是对于有几十个接口的网络层,我才不想用注解配置Headers,目前网 ... 
- Retrofit2和RxJava配合使用Demo
		和Retrofit2单独使用有一些区别 首先,同样写个interface,这里是GitHubService.java,我们这次要实现获取官方提供的测试接口的数据 public interface Gi ... 
随机推荐
- smali文件语法参考
			Dalvik opcodes Author: Gabor Paller Vx values in the table denote a Dalvik register. Depending on th ... 
- 项目知识点.Part1
			1. storyboard中添加scrollview: 先添加scrollView,进行约束 添加View 进行约束 相对于scrollView 如果水平滑动:设置vertically in Cont ... 
- 开发Nginx模块
			开发Nginx模块 前面的哪些话 关于Nginx模块开发的博客资料,网上很多,很多.但是,每篇博客都只提要点,无法"step by step"照着做,对于初次接触Nginx开发的同 ... 
- PLSQL Developer如何设置自动打开上次编辑的文件
			作为开发人员经常把sql语句保存到文件中以方便下次继续使用,问题是plsqlDev重启后每次都需要手工打开这个文件,好不方便: 以下设置是plsqlDev启动后自动打开上次编辑的文件. 选择配置> ... 
- study note--(Education)
			some good temoplates: A child's education has never been about learning information and basic skills ... 
- BZOJ 2423 最长公共子序列
			Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0, ... 
- 解决Ext.TextField的AllowBlank不能过滤空格代码
			Ext过滤空格 重写了组件... Ext.apply(Ext.form.TextField.prototype, { validator : function(text) { if (this.all ... 
- 关于type check的定义
			Concept: Type Checking There is no static type checking in Scheme; type checking is done at run time ... 
- bzoj 1560 [JSOI2009]火星藏宝图(DP)
			1560: [JSOI2009]火星藏宝图 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 647 Solved: 309[Submit][Status ... 
- NOI题库1799 最短前缀
			1799:最短前缀 总时间限制: 1000ms 内存限制: 65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: &quo ... 
