http://download.csdn.net/detail/u013217757/9782038
d:
cd D:\RxJavaCode\Server\RxJavaServer\src
//Rxjava for android
compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// compile 'org.xutils:xutils:3.3.40'
// compile 'com.squareup.picasso:picasso:2.5.2'
//photoview
compile 'com.github.chrisbanes:PhotoView:1.3.1'
//glide
compile 'com.github.bumptech.glide:glide:3.7.0'
//如果你的网络请求底层使用了Okhttp的话,那么可以指定这个让Glide网络层使用Okhttp
compile('com.github.bumptech.glide:okhttp3-integration:1.4.0') {
exclude group: 'glide-parent'
}
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//Gson converter
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//RxJava2 retrofit Adapter
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//okhttp3
compile 'com.squareup.okhttp3:okhttp:3.4.1'
//okhttp3日志拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
//自动注解 butterknife
compile 'com.jakewharton:butterknife:5.1.1'
//上下拉刷新 SwipeToLoadLayout
compile 'com.github.Aspsine:SwipeToLoadLayout:1.0.4'
compile 'com.android.support:design:25.1.0'
//加载进度条
compile 'com.mikhaellopez:circularprogressbar:1.1.1'
// compile 'com.github.waynell:VideoListPlayer:1.4'
//视频录制, 利用FFmpeg视频录制与压缩处理
compile 'com.mabeijianxi:small-video-record:1.0.8'
//图片选择器
compile(project(':PhotoPicker')) {
// exclude group: 'com.android.support', module: 'recyclerview'
exclude group: 'com.github.bumptech.glide',
module: 'glide'
}
/**
* JAVA8 的Lambda表达式 总结:
* 1.只用一个回调方法的接口可以使用 Lambda表达式
* -----------------------------
* 2.没有带参和没有返回值的方法:
* void onclick(){
* } - Lambda表达式-> ()->{}
* ------------------------------
* 3. 单个带参和没有返回值的方法:
* void onclick(View v){
* Log.e(v.getid());
* }
* Lambda表达式:
* 3.1,指定参数类型
* (View v)->{ Log.e(v.getid());}
* 3.2,直接给Lambda推导
* v->{ Log.e(v.getid());}
* 3.3更精简的方法
* v->Log.e(v.getid());
*
* 以上的功能都一致的
*----------------------------------
* 4.多个带参和没有返回值的方法:
* void onclick(View v,int position){
* Log.e(v.getid()+" pos:"+position);
* }
* Lambda表达式:
* 和3的使用方式一样:
* (View v,int pos)->{Log.e(v.getid()+" pos:"+pos)};
* 或(v,pos)->Log.e(v.getid()+" pos:"+pos);
*
* 5.有返回值的方法:
* public int add(int a,int b){
* return a+b;
* }
* 注意了:有返回值的要加{},不能忽略{}
* (a,b)->{return a+b;}
*
*/
TestLba t1= new TestLba() {
@Override
public void onclick(int a, int b) {
Log.e(TAG, "使用JAVA8 的Lambda表达式教程onCreate:>>>>>>> " + (a + b));
}
};
TestLba t2= (a, b) ->
Log.e(TAG, "使用JAVA8 的Lambda表达式教程onCreate:>>>>>>> " + (a + b));
t1.onclick(1, 2);
t2.onclick(100, 200);
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
//配置支持lamdba
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' // java8 语法支持
compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//Gson converter
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//RxJava2 retrofit Adapter
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//okhttp3
compile 'com.squareup.okhttp3:okhttp:3.4.1'
//okhttp3日志拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
package com.guoyi.circle.request;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import java.io.IOException;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.functions.Function;
import okhttp3.Interceptor;
import okhttp3.Response;
/**
* Created by Credit on 2017/3/14.
* 响应时,获取cookie拦截器
*/
public class GetOkHttpCookieInterceptor implements Interceptor {
private static final String TAG = "GetOkHttpCookie";
private Context context;
public GetOkHttpCookieInterceptor(Context context) {
super();
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
//这里获取请求返回的cookie
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
final StringBuffer cookieBuffer = new StringBuffer();
//最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可.大家可以用别的方法保存cookie数据
List headers = originalResponse.headers("Set-Cookie");
SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Observable.fromIterable(headers)
.map(new Function() {
@Override
public String apply(String s) throws Exception {
String[] cookieArray = s.split(";");
return cookieArray[0];
}
})
.subscribe(cookie -> {
Log.e(TAG, " 保存 cookie ---intercept: " + cookie);
String[] split = cookie.split("=");
editor.putString(split[0], cookie + ";");
// cookieBuffer.append(cookie).append(";");
});
editor.commit();
}
return originalResponse;
}
}
package com.guoyi.circle.request;
import android.content.Context;
import android.content.SharedPreferences;
import java.io.IOException;
import io.reactivex.Observable;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by Credit on 2017/3/14.
* 请求时,添加cookie拦截器
*/
public class AddOkHttpCookieIntercept implements Interceptor {
private Context context;
public AddOkHttpCookieIntercept(Context context) {
super();
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
final Request.Builder builder = chain.request().newBuilder();
SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);
//最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可
/**
* beegosessionID --beego默认返回的seession key
*
*this.Ctx.SetCookie("mobile", u.Mobile, maxTime, "/")
this.Ctx.SetCookie("pwd", u.Pwd, maxTime, "/")
服务器对应的cookie
*/
String beegosessionID = sharedPreferences.getString("beegosessionID", "");
String mobile = sharedPreferences.getString("mobile", "");
String pwd = sharedPreferences.getString("pwd", "");
Observable.just(beegosessionID, mobile, pwd)
.subscribe(cookie -> {
//添加cookie
builder.addHeader("Cookie", cookie);
});
return chain.proceed(builder.build());
}
}
为TextView设置链接:、
当文字中出现URL、E-mail、电话号码等的时候,我们为TextView设置链接。总结起来,一共有4种方法来为TextView实现链接。我们一一举例介绍;
1. 在xml里添加android:autoLink属性。
android:autoLink :的可选值:none/web/email/phone/map/all,分别代表将当前文本设置为:
普通文本/URL/email/电话号码/map/自动识别,文本显示为可点击的链接。其中:设置为all时,系统会自动根据你的文本格式识别文本类型,如:http为web,tel为电话等;当然,以上内容也可以在Java代码中完成,用法为tv.setAutoLinkMask(Linkify.ALL)。
2. 将显示内容写到资源文件,一般为String.xml中,并且用标签来声明链接,然后激活这个链接,激活链接需要在Java代码中使用setMovementMethod()方法设置TextView为可点击。
3. 用Html类的fromHtml()方法格式化要放到TextView里的文字。然后激活这个链接,激活链接需要在Java代码中使用setMovementMethod()方法设置TextView为可点击。
4. 用Spannable或实现它的类,如SpannableString。与其他方法不同的是,Spannable对象可以为个别字符设置链接(当然也可以为个别字符设置颜色、字体等,实现某些字符高亮显示的效果等)。这个方法同样需要在Java代码中使用setMovementMethod()方法设置TextView为可点击。
TextView中设置多种字体大小
这是项目中经常遇到的,比如UI是这样的:
Android实战技巧之文本与布局
像这样的两种字体,要如何处理呢?需要用到android.text命名空间下的一些与spannable相关的类和接口。例子如:
//[java] view plain copy 在CODE上查看代码片派生到我的代码片
String text = "Android实战技巧之文本与布局";
int start = text.indexOf('之');
int end = text.length();
Spannable textSpan = new Spannable(text);
textSpan.setSpan(new AbsoluteSizeSpan(20),0,start,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(12),start,end,Spannable.SPAN_INCLUSIVE_INCLUSIVE);