Skip to content

Commit 4a6ce7b

Browse files
committed
修复热更新没加载成功,热更新测试通过
添加离线读取缓存
1 parent a68e959 commit 4a6ce7b

File tree

15 files changed

+211
-46
lines changed

15 files changed

+211
-46
lines changed

app/src/main/java/com/rae/cnblogs/CnblogsApplication.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.rae.cnblogs;
22

33
import android.app.Application;
4-
import android.content.Context;
5-
import android.support.multidex.MultiDex;
64

75
import com.avos.avoscloud.AVOSCloud;
86
import com.avos.avoscloud.feedback.FeedbackThread;
@@ -14,7 +12,6 @@
1412
import com.rae.swift.session.SessionManager;
1513
import com.squareup.leakcanary.LeakCanary;
1614
import com.tencent.bugly.Bugly;
17-
import com.tencent.bugly.beta.Beta;
1815
import com.tencent.tinker.loader.app.TinkerApplication;
1916
import com.tencent.tinker.loader.shareutil.ShareConstants;
2017
import com.umeng.socialize.PlatformConfig;
@@ -80,24 +77,6 @@ private void onDebugMode() {
8077

8178
}
8279

83-
@Override
84-
protected void attachBaseContext(Context base) {
85-
super.attachBaseContext(base);
86-
87-
// DEX分包
88-
MultiDex.install(base);
89-
90-
// 安装tinker
91-
Beta.installTinker(this);
92-
}
93-
94-
@Override
95-
public void onTrimMemory(int level) {
96-
super.onTrimMemory(level);
97-
if (level == TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_BACKGROUND) {
98-
ImageLoader.getInstance().getMemoryCache().clear();
99-
}
100-
}
10180

10281
/**
10382
* 清除应用
Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.rae.cnblogs;
22

3+
import android.annotation.TargetApi;
34
import android.app.Application;
5+
import android.content.ComponentCallbacks2;
6+
import android.content.Context;
47
import android.content.Intent;
8+
import android.os.Build;
9+
import android.support.multidex.MultiDex;
510

6-
import com.rae.cnblogs.sdk.UserProvider;
7-
import com.rae.cnblogs.sdk.bean.UserInfoBean;
8-
import com.rae.cnblogs.sdk.db.DbCnblogs;
9-
import com.rae.swift.session.SessionManager;
10-
import com.tencent.bugly.Bugly;
11+
import com.nostra13.universalimageloader.core.ImageLoader;
12+
import com.tencent.bugly.beta.Beta;
1113
import com.tencent.bugly.beta.tinker.TinkerApplicationLike;
12-
import com.umeng.socialize.PlatformConfig;
13-
import com.umeng.socialize.UMShareAPI;
1414

1515
/**
1616
* 应用程序
@@ -23,7 +23,27 @@ public CnblogsApplicationProxy(Application application, int tinkerFlags, boolean
2323
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
2424
}
2525

26+
@Override
27+
public void onCreate() {
28+
super.onCreate();
29+
}
2630

31+
@Override
32+
public void onTrimMemory(int level) {
33+
super.onTrimMemory(level);
34+
if (level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW || level == ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
35+
ImageLoader.getInstance().getMemoryCache().clear();
36+
}
37+
}
2738

28-
39+
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
40+
@Override
41+
public void onBaseContextAttached(Context base) {
42+
super.onBaseContextAttached(base);
43+
// you must install multiDex whatever tinker is installed!
44+
MultiDex.install(base);
45+
// 安装tinker
46+
// TinkerManager.installTinker(this); 替换成下面Bugly提供的方法
47+
Beta.installTinker(this);
48+
}
2949
}

app/src/main/java/com/rae/cnblogs/RxObservable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static Observable<Integer> newThread() {
4242
public void accept(Disposable disposable) throws Exception {
4343
put(disposable, "thread");
4444
}
45-
}).subscribeOn(Schedulers.io());
45+
}).subscribeOn(Schedulers.newThread());
4646
}
4747

4848
private static void put(@NonNull Disposable disposable, String tag) {

app/src/main/java/com/rae/cnblogs/activity/TestActivity.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import android.os.Bundle;
44
import android.support.annotation.Nullable;
55
import android.support.v7.app.AppCompatActivity;
6+
import android.util.Log;
7+
import android.view.View;
68

9+
import com.rae.cnblogs.AppUI;
710
import com.rae.cnblogs.R;
11+
import com.tencent.bugly.beta.tinker.TinkerManager;
812

913
/**
1014
* TEST ACTIVITY
@@ -16,5 +20,49 @@ public class TestActivity extends AppCompatActivity {
1620
protected void onCreate(@Nullable Bundle savedInstanceState) {
1721
super.onCreate(savedInstanceState);
1822
setContentView(R.layout.activity_test);
23+
24+
Log.i("rae", "基类版本:" + TinkerManager.getTinkerId());
25+
Log.i("rae", "补丁版本:" + TinkerManager.getNewTinkerId());
26+
27+
findViewById(R.id.btn_main).setOnClickListener(new View.OnClickListener() {
28+
@Override
29+
public void onClick(View v) {
30+
AppUI.toastInCenter(getApplicationContext(), "dddd!");
31+
}
32+
});
33+
34+
TinkerManager.getInstance().setTinkerListener(new TinkerManager.TinkerListener() {
35+
@Override
36+
public void onDownloadSuccess(String s) {
37+
38+
}
39+
40+
@Override
41+
public void onDownloadFailure(String s) {
42+
43+
}
44+
45+
@Override
46+
public void onApplySuccess(String s) {
47+
AppUI.toastInCenter(getApplicationContext(), "补丁应用成功!" + s);
48+
}
49+
50+
@Override
51+
public void onApplyFailure(String s) {
52+
AppUI.toastInCenter(getApplicationContext(), "补丁应用失败!" + s);
53+
}
54+
55+
@Override
56+
public void onPatchRollback() {
57+
58+
}
59+
});
60+
findViewById(R.id.btn_test).setOnClickListener(new View.OnClickListener() {
61+
@Override
62+
public void onClick(View v) {
63+
TinkerManager.getInstance().applyPatch("/sdcard/patch_signed_7zip.apk", true);
64+
}
65+
});
1966
}
67+
2068
}

app/src/main/java/com/rae/cnblogs/adapter/BaseItemAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface onItemClickListener<T> {
2727
void onItemClick(T item);
2828
}
2929

30-
private List<T> mDataList;
30+
protected List<T> mDataList;
3131
private LayoutInflater mLayoutInflater;
3232
private Context mContext;
3333

app/src/main/java/com/rae/cnblogs/adapter/BlogListItemAdapter.java

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.rae.cnblogs.adapter;
22

33
import android.content.Context;
4+
import android.graphics.Bitmap;
45
import android.graphics.drawable.ColorDrawable;
56
import android.support.v4.content.ContextCompat;
67
import android.support.v7.widget.RecyclerView;
@@ -19,6 +20,7 @@
1920
import com.rae.cnblogs.sdk.UserProvider;
2021
import com.rae.cnblogs.sdk.bean.BlogBean;
2122
import com.rae.cnblogs.sdk.bean.BlogType;
23+
import com.rae.cnblogs.widget.PlaceholderView;
2224
import com.rae.swift.Rx;
2325

2426
import java.util.ArrayList;
@@ -31,11 +33,13 @@
3133
public class BlogListItemAdapter extends BaseItemAdapter<BlogBean, RecyclerView.ViewHolder> implements View.OnClickListener {
3234

3335
private final BlogType mBlogType;
36+
private final PlaceholderView mPlaceholderView;
3437

3538

3639
private DisplayImageOptions mAvatarOptions;
40+
private DisplayImageOptions mThumbImageOption;
3741

38-
public BlogListItemAdapter(Context context, BlogType type) {
42+
public BlogListItemAdapter(Context context, BlogType type, PlaceholderView placeholderView) {
3943
if (type == BlogType.NEWS) {
4044
mAvatarOptions = RaeImageLoader.fadeOptions(500)
4145
.showImageOnLoading(0)
@@ -44,17 +48,42 @@ public BlogListItemAdapter(Context context, BlogType type) {
4448
} else {
4549
mAvatarOptions = RaeImageLoader.headerOption();
4650
}
51+
52+
ColorDrawable drawable = new ColorDrawable(ContextCompat.getColor(context, R.color.background_divider));
53+
54+
mThumbImageOption = new DisplayImageOptions.Builder()
55+
.cacheOnDisk(true)
56+
.cacheInMemory(true)
57+
.bitmapConfig(Bitmap.Config.ARGB_8888)
58+
.showImageForEmptyUri(drawable)
59+
.showImageOnLoading(drawable)
60+
.showImageOnFail(R.drawable.picture_viewer_no_pic_icon)
61+
.build();
62+
63+
mPlaceholderView = placeholderView;
4764
mBlogType = type;
65+
loading();
66+
}
67+
68+
public void loading() {
4869
int size = 5;
4970
List<BlogBean> data = new ArrayList<>();
5071
for (int i = 0; i < size; i++) {
5172
BlogBean m = new BlogBean();
5273
m.setTag("loading");
5374
data.add(m);
5475
}
55-
5676
invalidate(data);
77+
}
5778

79+
public void empty() {
80+
if (mDataList != null) {
81+
mDataList.clear();
82+
}
83+
List<BlogBean> data = new ArrayList<>();
84+
BlogBean m = new BlogBean();
85+
m.setTag("empty");
86+
invalidate(data);
5887
}
5988

6089
@Override
@@ -66,6 +95,9 @@ public int getItemViewType(int position) {
6695
if (blog != null && TextUtils.equals("loading", blog.getTag())) {
6796
return VIEW_TYPE_LOADING;
6897
}
98+
if (blog != null && TextUtils.equals("empty", blog.getTag())) {
99+
return VIEW_TYPE_EMPTY;
100+
}
69101
return VIEW_TYPE_NORMAL;
70102
}
71103

@@ -74,6 +106,9 @@ public RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater inflater, ViewG
74106
if (viewType == VIEW_TYPE_LOADING) {
75107
return new ItemLoadingViewHolder(inflateView(parent, R.layout.item_list_loading));
76108
}
109+
if (viewType == VIEW_TYPE_EMPTY) {
110+
return new ItemLoadingViewHolder(mPlaceholderView);
111+
}
77112

78113
int layoutId = R.layout.item_blog_list;
79114

@@ -88,7 +123,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater inflater, ViewG
88123
@Override
89124
public void onBindViewHolder(RecyclerView.ViewHolder vh, int position, final BlogBean m) {
90125

91-
if (getItemViewType(position) == VIEW_TYPE_LOADING) {
126+
if (getItemViewType(position) == VIEW_TYPE_LOADING || getItemViewType(position) == VIEW_TYPE_EMPTY) {
92127
return;
93128
}
94129

@@ -160,14 +195,14 @@ private void showThumbImages(BlogBean m, BlogItemViewHolder holder) {
160195
// 一张预览图
161196
holder.largeThumbView.setVisibility(View.VISIBLE);
162197
holder.thumbLayout.setVisibility(View.GONE);
163-
ImageLoader.getInstance().displayImage(thumbs.get(0), holder.largeThumbView);
198+
ImageLoader.getInstance().displayImage(thumbs.get(0), holder.largeThumbView, mThumbImageOption);
164199
} else if (thumbs.size() >= 3) {
165200
holder.largeThumbView.setVisibility(View.GONE);
166201
holder.thumbLayout.setVisibility(View.VISIBLE);
167202
// 取三张预览图
168-
ImageLoader.getInstance().displayImage(thumbs.get(0), holder.thumbOneView);
169-
ImageLoader.getInstance().displayImage(thumbs.get(1), holder.thumbTwoView);
170-
ImageLoader.getInstance().displayImage(thumbs.get(2), holder.thumbThreeView);
203+
ImageLoader.getInstance().displayImage(thumbs.get(0), holder.thumbOneView, mThumbImageOption);
204+
ImageLoader.getInstance().displayImage(thumbs.get(1), holder.thumbTwoView, mThumbImageOption);
205+
ImageLoader.getInstance().displayImage(thumbs.get(2), holder.thumbThreeView, mThumbImageOption);
171206
} else {
172207
holder.largeThumbView.setVisibility(View.GONE);
173208
holder.thumbLayout.setVisibility(View.GONE);

app/src/main/java/com/rae/cnblogs/fragment/BlogListFragment.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.support.annotation.Nullable;
55
import android.support.v7.widget.LinearLayoutManager;
66
import android.view.View;
7+
import android.view.ViewGroup;
8+
import android.widget.FrameLayout;
79

810
import com.jcodecraeer.xrecyclerview.XRecyclerView;
911
import com.rae.cnblogs.R;
@@ -17,7 +19,9 @@
1719
import com.rae.cnblogs.service.JobScheduler;
1820
import com.rae.cnblogs.service.job.JobEvent;
1921
import com.rae.cnblogs.widget.AppLayout;
22+
import com.rae.cnblogs.widget.PlaceholderView;
2023
import com.rae.cnblogs.widget.RaeRecyclerView;
24+
import com.rae.swift.Rx;
2125

2226
import org.greenrobot.eventbus.EventBus;
2327
import org.greenrobot.eventbus.Subscribe;
@@ -58,6 +62,7 @@ public static BlogListFragment newInstance(int position, CategoryBean category,
5862

5963
protected IBlogListPresenter mBlogListPresenter;
6064
protected BlogListItemAdapter mItemAdapter;
65+
private PlaceholderView mPlaceholderView;
6166

6267
@Override
6368
protected int getLayoutId() {
@@ -67,9 +72,18 @@ protected int getLayoutId() {
6772
@Override
6873
public void onCreate(@Nullable Bundle savedInstanceState) {
6974
super.onCreate(savedInstanceState);
75+
mPlaceholderView = new PlaceholderView(getContext());
76+
mPlaceholderView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
77+
mPlaceholderView.setOnRetryClickListener(new View.OnClickListener() {
78+
@Override
79+
public void onClick(View v) {
80+
mBlogListPresenter.start();
81+
}
82+
});
83+
7084
mCategory = getArguments().getParcelable("category");
7185
mBlogType = BlogType.typeOf(getArguments().getString("type"));
72-
mItemAdapter = new BlogListItemAdapter(this.getContext(), mBlogType);
86+
mItemAdapter = new BlogListItemAdapter(this.getContext(), mBlogType, mPlaceholderView);
7387
mBlogListPresenter = CnblogsPresenterFactory.getBlogListPresenter(getContext(), mBlogType, this);
7488
EventBus.getDefault().register(this);
7589
}
@@ -124,6 +138,10 @@ public void onLoadMore() {
124138

125139
@Override
126140
public void onLoadBlogList(int page, List<BlogBean> data) {
141+
if (Rx.isEmpty(data) && page <= 1) {
142+
mAppLayout.refreshComplete();
143+
return;
144+
}
127145
mRecyclerView.setNoMore(false);
128146
mRecyclerView.setLoadingMoreEnabled(true);
129147
if (page <= 1)
@@ -136,6 +154,7 @@ public void onLoadBlogList(int page, List<BlogBean> data) {
136154

137155
// 通知异步下载博文内容
138156
EventBus.getDefault().post(new JobEvent(JobScheduler.ACTION_BLOG_CONTENT));
157+
139158
}
140159

141160
@Override

app/src/main/java/com/rae/cnblogs/presenter/impl/BasePresenter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.rae.cnblogs.presenter.impl;
22

33
import android.content.Context;
4+
import android.net.ConnectivityManager;
5+
import android.net.NetworkInfo;
46
import android.text.TextUtils;
57

68
import com.rae.cnblogs.RxObservable;
@@ -66,4 +68,15 @@ protected boolean isNotLogin() {
6668
public <T> Observable<T> createObservable(Observable<T> observable) {
6769
return RxObservable.create(observable, mTag);
6870
}
71+
72+
73+
/**
74+
* 网络是否可用
75+
*/
76+
protected boolean isNetworkError() {
77+
ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
78+
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
79+
return networkInfo == null || !networkInfo.isConnected() || !networkInfo.isAvailable();
80+
}
81+
6982
}

0 commit comments

Comments
 (0)