java半球最多_多是东半球最全的RxJava使用场景小结

1、Scheduler线程切换html

这样的场景经常会在“后台线程取数据,主线程展现”的模式中看见java

Observable.just(1, 2, 3, 4)

.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程

.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程

.subscribe(new Action1() {

@Override

public void call(Integer number) {

Log.d(tag, "number:" + number);

}

});

2、使用debounce作textSearchgit

用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会本身主动过滤掉前N-1个结点。github

比方在作百度地址联想的时候,可以使用debounce下降频繁的网络请求。避免每输入(删除)一个字就作一次联想数组

RxTextView.textChangeEvents(inputEditText)

.debounce(400, TimeUnit.MILLISECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onCompleted() {

log.d("onComplete");

}

@Override

public void onError(Throwable e) {

log.d("Error");

}

@Override

public void onNext(TextViewTextChangeEvent onTextChangeEvent) {

log.d(format("Searching for %s", onTextChangeEvent.text().toString()));

}

});

3、Retrofit结合RxJava作网络请求框架

这里不做具体解释。具体的介绍可以看扔物线的这篇文章,对RxJava的入门者有很是大的启示。

当中也讲到了RxJava和Retrofit怎样结合来实现更简洁的代码缓存

4、RxJava取代EventBus进行数据传递:RxBus

注意:RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果。这篇文章把RxBus讲的比較具体。

5、使用combineLatest合并近期N个结点好比:注冊的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注冊button。Observable _emailChangeObservable = RxTextView.textChanges(_email).skip(1);

Observable _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);

Observable _numberChangeObservable = RxTextView.textChanges(_number).skip(1);

Observable.combineLatest(_emailChangeObservable,

_passwordChangeObservable,

_numberChangeObservable,

new Func3() {

@Override

public Boolean call(CharSequence newEmail,

CharSequence newPassword,

CharSequence newNumber) {

Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber);

boolean emailValid = !isEmpty(newEmail) &&

EMAIL_ADDRESS.matcher(newEmail).matches();

if (!emailValid) {

_email.setError("Invalid Email!");

}

boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;

if (!passValid) {

_password.setError("Invalid Password!");

}

boolean numValid = !isEmpty(newNumber);

if (numValid) {

int num = Integer.parseInt(newNumber.toString());

numValid = num > 0 && num <= 100;

}

if (!numValid) {

_number.setError("Invalid Number!");

}

return emailValid && passValid && numValid;

}

})//

.subscribe(new Observer() {

@Override

public void onCompleted() {

log.d("completed");

}

@Override

public void onError(Throwable e) {

log.d("Error");

}

@Override

public void onNext(Boolean formValid) {

_btnValidIndicator.setEnabled(formValid);

}

});

6、使用merge合并两个数据源。网络

好比一组数据来自网络,一组数据来自文件。需要合并两组数据一块儿展现。app

Observable.merge(getDataFromFile(), getDataFromNet())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Subscriber() {

@Override

public void onCompleted() {

log.d("done loading all data");

}

@Override

public void onError(Throwable e) {

log.d("error");

}

@Override

public void onNext(String data) {

log.d("all merged data will pass here one by one!")

});

7、使用concat和first作缓存框架

依次检查memory、disk和network中是否存在数据。不论什么一步一旦发现数据后面的操做都不运行。ide

Observable memory = Observable.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

if (memoryCache != null) {

subscriber.onNext(memoryCache);

} else {

subscriber.onCompleted();

}

}

});

Observable disk = Observable.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

String cachePref = rxPreferences.getString("cache").get();

if (!TextUtils.isEmpty(cachePref)) {

subscriber.onNext(cachePref);

} else {

subscriber.onCompleted();

}

}

});

Observable network = Observable.just("network");

//依次检查memory、disk、network

Observable.concat(memory, disk, network)

.first()

.subscribeOn(Schedulers.newThread())

.subscribe(s -> {

memoryCache = "memory";

System.out.println("--------------subscribe: " + s);

});

8、使用timer作定时操做。当有“x秒后运行y操做”相似的需求的时候。想到使用timer

好比:2秒后输出日志“hello world”,而后结束。

Observable.timer(2, TimeUnit.SECONDS)

.subscribe(new Observer() {

@Override

public void onCompleted() {

log.d ("completed");

}

@Override

public void onError(Throwable e) {

log.e("error");

}

@Override

public void onNext(Long number) {

log.d ("hello world");

}

});

9、使用interval作周期性操做。当有“每隔xx秒后运行yy操做”相似的需求的时候,想到使用interval 好比:每隔2秒输出日志“helloworld”。

Observable.interval(2, TimeUnit.SECONDS)

.subscribe(new Observer() {

@Override

public void onCompleted() {

log.d ("completed");

}

@Override

public void onError(Throwable e) {

log.e("error");

}

@Override

public void onNext(Long number) {

log.d ("hello world");

}

});

10、使用throttleFirst防止button反复点击

ps:debounce也能达到相同的效果

RxView.clicks(button)

.throttleFirst(1, TimeUnit.SECONDS)

.subscribe(new Observer() {

@Override

public void onCompleted() {

log.d ("completed");

}

@Override

public void onError(Throwable e) {

log.e("error");

}

@Override

public void onNext(Object o) {

log.d("button clicked");

}

});

11、使用schedulePeriodically作轮询请求

Observable.create(new Observable.OnSubscribe() {

@Override

public void call(final Subscriber super String> observer) {

Schedulers.newThread().createWorker()

.schedulePeriodically(new Action0() {

@Override

public void call() {

observer.onNext(doNetworkCallAndGetStringResult());

}

}, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);

}

}).subscribe(new Action1() {

@Override

public void call(String s) {

log.d("polling….”));

}

})

12、RxJava进行数组、list的遍历

String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};

Observable

.from(names)

.subscribe(new Action1() {

@Override

public void call(String name) {

log.d(name);

}

});

十3、解决嵌套回调(callback hell)问题

NetworkService.getToken("username", "password")

.flatMap(s -> NetworkService.getMessage(s))

.subscribe(s -> {

System.out.println("message: " + s);

})

十4、响应式的界面

比方勾选了某个checkbox,本身主动更新相应的preference

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);

Preference checked = rxPreferences.getBoolean("checked", true);

CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);

RxCompoundButton.checkedChanges(checkBox)

.subscribe(checked.asAction());

最后。由于我的能力有限,文章不免有疏漏之处,假设您有不论什么疑议。请让我知道。谢谢!本文所有的样例已经上传到github上

致谢:这篇文章的绝大多数样例是从这里总结的。还有部分样例来自这里。

对做者的无私贡献表示感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用半球光照的OpenGL的例子: 首先,我们需要加载半球体纹理。这里我们使用了一个预先生成的半球体纹理,它是一个立方体贴图,其中的每个面都是一个半球体的投影。我们可以使用stb_image库来加载纹理: ```c++ int width, height, nrComponents; unsigned char *data = stbi_load("half_sphere_map.png", &width, &height, &nrComponents, 0); unsigned int envCubemap; glGenTextures(1, &envCubemap); glBindTexture(GL_TEXTURE_CUBE_MAP, envCubemap); for (unsigned int i = 0; i < 6; ++i) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); stbi_image_free(data); ``` 接下来,我们需要在着色器中实现半球光照。下面是一个使用GLSL实现半球光照的片段着色器: ```glsl #version 330 core out vec4 FragColor; in vec3 FragPos; in vec3 Normal; uniform samplerCube envCubemap; const float PI = 3.14159265359; void main() { // 计算半球体的纹理坐标 vec3 N = normalize(Normal); vec3 R = reflect(-FragPos, N); vec3 up = vec3(0.0, 1.0, 0.0); vec3 right = cross(up, N); up = cross(N, right); mat3 rotMat = mat3(right, up, N); vec3 envMapCoord = rotMat * R; // 采样半球体纹理 vec3 envColor = texture(envCubemap, envMapCoord).rgb; // 输出最终颜色 FragColor = vec4(envColor, 1.0); } ``` 在这个着色器中,我们首先计算顶点的法向量,并将其归一化。然后,我们使用这个法向量计算半球体的纹理坐标,并采样半球体纹理。最后,我们将环境光颜色作为输出的最终颜色。 最后,我们需要将半球体纹理绑定到立方体贴图中,并将其传递给着色器: ```c++ glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, envCubemap); shader.setInt("envCubemap", 0); ``` 这样就完成了半球光照的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值