public interface APIService {
/**
* 尽量不要在前面加 / ,尽量在BASE_URL后面加 / , 然后组成的就是 base_url + start-image/1080*1776
* */
@GET("start-image/1080*1776")
Call<StratImage> loadStartImage();
@GET("news/{id}")
Call<NewsContent> loadNewsContent(@Path("id") int id);
@GET("news/{id}")
Observable<NewsContent> loadNewContentRX(@Path("id") int id);
@GET("news/{latest}")
Observable<NewsLatest> loadNewsLatsetRX(@Path("latest") String latset);
}
public class ServiceManager {
public APIService mAPIService;
private static ServiceManager mServiceManager = null ;
private ServiceManager(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppUrl.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
mAPIService = retrofit.create(APIService.class);
}
public static ServiceManager getManager(){
if (mServiceManager == null){
mServiceManager = new ServiceManager();
}
return mServiceManager ;
}
}
private void loadContentRX() {
ServiceManager.getManager().mAPIService
.loadNewContentRX(3892357)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<NewsContent>() {
@Override
public void onCompleted() {
Logger.d("success");
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
}
@Override
public void onNext(NewsContent newsContent) {
Logger.d(newsContent.toString());
}
});
}
- 下面代码比上面多了一步操作,就是讲得到的内容进行保存操作,也可以不需要这一步!
private void loadContentRX() {
final NewsContent news = (NewsContent) ACache.get(this).getAsObject("news");
if (news !=null){
Logger.d(news.toString());
}else {
ServiceManager.getManager().mAPIService
.loadNewContentRX(3892357)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.io())
.doOnNext(new Action1<NewsContent>() {
@Override
public void call(NewsContent newsContent) {
saveNewsContent(newsContent);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<NewsContent>() {
@Override
public void onCompleted() {
Logger.d("success");
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
}
@Override
public void onNext(NewsContent newsContent) {
Logger.d(newsContent.toString());
}
});
}
}
private void saveNewsContent(NewsContent newsContent) {
ACache aCache = ACache.get(MainActivity.this);
aCache.put("news" , newsContent);
}
- 然后就是关于dialog 和点击事件的处理了
- 其实网上可以使用RxBing的库进行操作防抖事件,但是我没有搞明白,如果有搞明白的大哥 可以指点一下
public class MultipleClick {
/**
* 防止多次点击 在点击事件里面调用
* */
public static void blockView(final View view) {
view.setEnabled(false);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
view.setEnabled(true);
}
}, 500);
}
}
public class ProgressUtil {
private static ProgressDialog dialog;
public static void showDialog(Context context){
dialog = new ProgressDialog(context);
dialog.setTitle("标题");
dialog.setMessage("wait...");
dialog.show();
}
public static void dismissDialog(){
if (dialog != null){
dialog.dismiss();
dialog = null;
}
}
}
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MultipleClick.blockView(mButton);
loadContentRX();
}
});
private void loadContentRX() {
ProgressUtil.showDialog(MainActivity.this);
ServiceManager.getManager().mAPIService
.loadNewsLatsetRX("latest")
.throttleFirst(5000, TimeUnit.MINUTES)
.flatMap(new Func1<NewsLatest, Observable<NewsContent>>() {
@Override
public Observable<NewsContent> call(NewsLatest newsLatest) {
int id = newsLatest.getStories().get(0).getId();
return ServiceManager.getManager().mAPIService.loadNewContentRX(id);
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<NewsContent>() {
@Override
public void onCompleted() {
Logger.d("成功");
ProgressUtil.dismissDialog();
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
ProgressUtil.dismissDialog();
}
@Override
public void onNext(NewsContent newsContent) {
Logger.d(newsContent.toString());
ProgressUtil.dismissDialog();
}
});
}