Skip to content

Commit e5c9b4e

Browse files
committed
加入定时器、轮询器、PublishSubject Demo
1 parent 2645d83 commit e5c9b4e

21 files changed

Lines changed: 559 additions & 6 deletions

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ dependencies {
3333
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
3434
compile 'com.trello:rxlifecycle:0.4.0'
3535
compile 'com.trello:rxlifecycle-components:0.4.0'
36+
compile 'com.github.bumptech.glide:glide:3.6.1'
3637
}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
package com.che58.ljb.rxjava.fragment;
2+
3+
import android.content.Context;
4+
import android.os.Bundle;
5+
import android.support.annotation.Nullable;
6+
import android.support.v4.view.PagerAdapter;
7+
import android.support.v4.view.ViewPager;
8+
import android.view.LayoutInflater;
9+
import android.view.View;
10+
import android.view.ViewGroup;
11+
import android.view.animation.Interpolator;
12+
import android.widget.ImageView;
13+
import android.widget.Scroller;
14+
15+
import com.che58.ljb.rxjava.R;
16+
import com.trello.rxlifecycle.components.support.RxFragment;
17+
18+
import java.lang.reflect.Field;
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
import java.util.concurrent.TimeUnit;
22+
23+
import butterknife.Bind;
24+
import butterknife.ButterKnife;
25+
import butterknife.OnClick;
26+
import rx.Observable;
27+
import rx.Subscription;
28+
import rx.android.schedulers.AndroidSchedulers;
29+
import rx.functions.Action1;
30+
31+
/**
32+
* 轮询器Demo
33+
* Created by ljb on 2016/3/28.
34+
*/
35+
public class LoopFragment extends RxFragment {
36+
@Bind(R.id.viewpager)
37+
ViewPager mViewPager;
38+
39+
List<ImageView> mCacheViews = new ArrayList<>();
40+
41+
private int[] datas = new int[]{R.drawable.pic_1, R.drawable.pic_2, R.drawable.pic_3};
42+
private PicLoopAdapter loopAdapter;
43+
private Subscription subscribe_auto;
44+
45+
@Nullable
46+
@Override
47+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
48+
View view = inflater.inflate(R.layout.fragment_loop, null);
49+
ButterKnife.bind(this, view);
50+
return view;
51+
}
52+
53+
@Override
54+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
55+
super.onActivityCreated(savedInstanceState);
56+
initViewPager();
57+
startLoop();
58+
}
59+
60+
@OnClick(R.id.btn_start_loop)
61+
void startLoop() {
62+
autoLoop();
63+
}
64+
65+
@OnClick(R.id.btn_stop_loop)
66+
void stopLoop() {
67+
if (subscribe_auto != null && !subscribe_auto.isUnsubscribed()) {
68+
subscribe_auto.unsubscribe();
69+
}
70+
}
71+
72+
private void autoLoop() {
73+
if (subscribe_auto == null || subscribe_auto.isUnsubscribed()) {
74+
subscribe_auto = Observable.interval(3000, 3000, TimeUnit.MILLISECONDS)
75+
//延时3000 ,每间隔3000,时间单位
76+
.compose(this.<Long>bindToLifecycle())
77+
.observeOn(AndroidSchedulers.mainThread())
78+
.subscribe(new Action1<Long>() {
79+
@Override
80+
public void call(Long aLong) {
81+
int currentIndex = mViewPager.getCurrentItem();
82+
if (++currentIndex == loopAdapter.getCount()) {
83+
mViewPager.setCurrentItem(0);
84+
} else {
85+
mViewPager.setCurrentItem(currentIndex, true);
86+
}
87+
}
88+
});
89+
}
90+
}
91+
92+
private void initViewPager() {
93+
loopAdapter = new PicLoopAdapter(datas);
94+
mViewPager.setAdapter(loopAdapter);
95+
96+
try {
97+
//自定义滑动速度
98+
Field mScrollerField = ViewPager.class.getDeclaredField("mScroller");
99+
mScrollerField.setAccessible(true);
100+
mScrollerField.set(mViewPager, new ViewPagerScroller(mViewPager.getContext()));
101+
} catch (NoSuchFieldException e) {
102+
e.printStackTrace();
103+
} catch (IllegalAccessException e) {
104+
e.printStackTrace();
105+
}
106+
}
107+
108+
private class PicLoopAdapter extends PagerAdapter {
109+
110+
private int[] mDatas;
111+
112+
public PicLoopAdapter(int[] datas) {
113+
this.mDatas = datas;
114+
}
115+
116+
@Override
117+
public int getCount() {
118+
return Integer.MAX_VALUE;
119+
}
120+
121+
@Override
122+
public boolean isViewFromObject(View view, Object object) {
123+
return view == object;
124+
}
125+
126+
@Override
127+
public View instantiateItem(ViewGroup container, int position) {
128+
int index = position % mDatas.length;
129+
ImageView iv;
130+
if (mCacheViews.size() > 0) {
131+
iv = mCacheViews.remove(0);
132+
} else {
133+
iv = new ImageView(getActivity());
134+
iv.setLayoutParams(new ViewPager.LayoutParams());
135+
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
136+
}
137+
138+
iv.setImageResource(mDatas[index]);
139+
container.addView(iv);
140+
return iv;
141+
}
142+
143+
@Override
144+
public void destroyItem(ViewGroup container, int position, Object object) {
145+
container.removeView((View) object);
146+
mCacheViews.add((ImageView) object);
147+
}
148+
}
149+
150+
/**
151+
* 自定义Scroller,用于调节ViewPager滑动速度
152+
*/
153+
public class ViewPagerScroller extends Scroller {
154+
private int mScrollDuration = 1200;// 滑动速度
155+
156+
public ViewPagerScroller(Context context) {
157+
super(context);
158+
}
159+
160+
public ViewPagerScroller(Context context, Interpolator interpolator) {
161+
super(context, interpolator);
162+
}
163+
164+
public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
165+
super(context, interpolator, flywheel);
166+
}
167+
168+
@Override
169+
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
170+
super.startScroll(startX, startY, dx, dy, mScrollDuration);
171+
}
172+
173+
@Override
174+
public void startScroll(int startX, int startY, int dx, int dy) {
175+
super.startScroll(startX, startY, dx, dy, mScrollDuration);
176+
}
177+
}
178+
}

app/src/main/java/com/che58/ljb/rxjava/fragment/MergeFragment.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
5151
@Override
5252
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
5353
super.onActivityCreated(savedInstanceState);
54+
mergeDemo();
55+
}
56+
57+
private void mergeDemo() {
5458
Observable.merge(
5559
getDataFromLocation(),
5660
getDataFromNet()
@@ -92,11 +96,6 @@ public void call(Subscriber<? super List<Contacter>> subscriber) {
9296
contacters.add(new Contacter("net:Prometheus"));
9397
subscriber.onNext(contacters);
9498
subscriber.onCompleted();
95-
96-
97-
subscriber.onNext(contacters);
98-
subscriber.onCompleted();
99-
10099
}
101100
});
102101
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.che58.ljb.rxjava.fragment;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.TextView;
9+
10+
import com.che58.ljb.rxjava.R;
11+
import com.trello.rxlifecycle.components.support.RxFragment;
12+
13+
import butterknife.Bind;
14+
import butterknife.ButterKnife;
15+
import rx.functions.Action1;
16+
import rx.subjects.PublishSubject;
17+
18+
/**
19+
* PublishSubject Demo 底部Fragment
20+
* Created by ljb on 2016/3/28.
21+
*/
22+
public class PublishSubjectBottomFragment extends RxFragment {
23+
24+
@Bind(R.id.tv_result)
25+
TextView tv_result;
26+
27+
private final PublishSubject<String> publishSubject;
28+
29+
public PublishSubjectBottomFragment(PublishSubject<String> publishSubject) {
30+
this.publishSubject = publishSubject;
31+
}
32+
33+
@Nullable
34+
@Override
35+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36+
View view = inflater.inflate(R.layout.fragment_publish_bottom, null);
37+
ButterKnife.bind(this, view);
38+
return view;
39+
}
40+
41+
@Override
42+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
43+
super.onActivityCreated(savedInstanceState);
44+
initData();
45+
}
46+
47+
private void initData() {
48+
publishSubject.subscribe(new Action1<String>() {
49+
@Override
50+
public void call(String s) {
51+
tv_result.setText(s);
52+
}
53+
});
54+
}
55+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.che58.ljb.rxjava.fragment;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
9+
import com.che58.ljb.rxjava.R;
10+
import com.trello.rxlifecycle.components.support.RxFragment;
11+
12+
import butterknife.ButterKnife;
13+
import rx.subjects.PublishSubject;
14+
15+
/**
16+
* 可连接的Subject
17+
* 与普通的Subject不同,在订阅时并不立即触发订阅事件,而是允许我们在任意时刻手动调用onNext(),onError(),onCompleted来触发事件
18+
* Created by ljb on 2016/3/28.
19+
*/
20+
public class PublishSubjectFragment extends RxFragment {
21+
22+
23+
@Nullable
24+
@Override
25+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
26+
View view = inflater.inflate(R.layout.fragment_publish, null);
27+
ButterKnife.bind(this, view);
28+
return view;
29+
}
30+
31+
@Override
32+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
33+
super.onActivityCreated(savedInstanceState);
34+
35+
PublishSubject<String> publishSubject = PublishSubject.create();
36+
PublishSubjectTopFragment topFragment = new PublishSubjectTopFragment(publishSubject);
37+
PublishSubjectBottomFragment bottom_Fragment = new PublishSubjectBottomFragment(publishSubject);
38+
getActivity().getSupportFragmentManager()
39+
.beginTransaction()
40+
.replace(R.id.fl_top,topFragment, "top")
41+
.replace(R.id.fl_bottom, bottom_Fragment, "bottom")
42+
.commit();
43+
}
44+
45+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.che58.ljb.rxjava.fragment;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.EditText;
9+
10+
import com.che58.ljb.rxjava.R;
11+
import com.trello.rxlifecycle.components.support.RxFragment;
12+
13+
import butterknife.Bind;
14+
import butterknife.ButterKnife;
15+
import butterknife.OnClick;
16+
import rx.subjects.PublishSubject;
17+
18+
/**
19+
* PublishSubject Demo 顶部Fragment
20+
* Created by ljb on 2016/3/28.
21+
*/
22+
public class PublishSubjectTopFragment extends RxFragment {
23+
24+
@Bind(R.id.et_input)
25+
EditText et_input;
26+
27+
private final PublishSubject<String> publishSubject;
28+
29+
public PublishSubjectTopFragment(PublishSubject<String> publishSubject) {
30+
this.publishSubject = publishSubject;
31+
}
32+
33+
@Nullable
34+
@Override
35+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36+
View view = inflater.inflate(R.layout.fragment_publish_top , null);
37+
ButterKnife.bind(this, view);
38+
return view;
39+
}
40+
41+
@Override
42+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
43+
super.onActivityCreated(savedInstanceState);
44+
}
45+
46+
@OnClick(R.id.btn_send)
47+
void sendToBottom(){
48+
String result = et_input.getText().toString().trim();
49+
publishSubject.onNext(result);
50+
}
51+
}

0 commit comments

Comments
 (0)