ProvinceDataFetcher.java
11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
package com.wd.model;
import android.text.TextUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wd.capability.network.BaseObserver;
import com.wd.capability.network.bean.MetaBean;
import com.wd.capability.network.fetcher.BaseDataFetcher;
import com.wd.capability.network.response.BaseResponse;
import com.wd.common.api.RequestApi;
import com.wd.foundation.bean.launch.LaunchPageBean;
import com.wd.foundation.bean.response.AreaTreeselectBean;
import com.wd.foundation.wdkit.file.MyFileUtils;
import com.wd.foundation.wdkit.json.GsonUtils;
import com.wd.foundation.wdkit.mvvm.vm.IVMCallback;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkitcore.tools.AppContext;
import com.wd.foundation.wdkitcore.tools.StringUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* 省份信息
*
* @author libo
* @version [V1.0.0, 2022/08/27]
* @since V1.0.0
*/
public class ProvinceDataFetcher extends BaseDataFetcher<RequestApi> {
private static final String TAG = "ProvinceDataFetcher";
private final String AREAS_FILE_NAME = "areas_file_name.txt";
private IGetAreaRevealListener iGetAreaRevealListener;
private IGetAreaRevealListener iGetTwoAreaRevealListener;
public void setAreaRevealListener(IGetAreaRevealListener iGetAreaRevealListener) {
this.iGetAreaRevealListener = iGetAreaRevealListener;
}
public void setTwoAreaRevealListener(IGetAreaRevealListener iGetTwoAreaRevealListener) {
this.iGetTwoAreaRevealListener = iGetTwoAreaRevealListener;
}
/**
* 获取 地区展示
*/
public void getAreaReveal() {
String areaTreeMd5 = SpUtils.getAreaTreeMd5();
Observable<BaseResponse<List<AreaTreeselectBean>>> phoneCode = getRetrofit().getAreaReveal(areaTreeMd5);
request(phoneCode, new BaseObserver<List<AreaTreeselectBean>>() {
@Override
protected void dealSpecialCode(int code, String message) {
if (iGetAreaRevealListener != null) {
iGetAreaRevealListener.onFailed(message);
}
}
@Override
protected void onSuccess(List<AreaTreeselectBean> areaTreeselectBeans) {
}
@Override
protected void onSuccess(List<AreaTreeselectBean> areaDatas, MetaBean metaBean, String msg, int code) {
getAreaDataSuccess(areaDatas,metaBean,areaTreeMd5);
}
@Override
public void _onError(String e) {
List<AreaTreeselectBean> areaDataList = new ArrayList<>();
areaDataList.addAll(getLocalAreaData());
if (iGetAreaRevealListener != null) {
iGetAreaRevealListener.onSuccess(areaDataList);
}
}
});
}
private List<AreaTreeselectBean> getLocalAreaData(){
List<AreaTreeselectBean> areaDataList = new ArrayList<>();
String areaTreeData = SpUtils.getAreaTreeData();
if (StringUtils.isNotBlank(areaTreeData)){
areaDataList = GsonUtils.jsonToArrayList(areaTreeData, AreaTreeselectBean.class);
}
return areaDataList;
}
/**
* 请求区域成功
*/
private void getAreaDataSuccess(List<AreaTreeselectBean> areaData, MetaBean metaBean, String areaTreeMd5){
List<AreaTreeselectBean> areaDataList = new ArrayList<>();
if (metaBean != null){
String md5 = metaBean.getMd5();
if (areaTreeMd5.equals(md5)){
//md5 没变使用缓存
areaDataList.addAll(getLocalAreaData());
}else {
//md5 发生变化重新存下md5
areaDataList.addAll(areaData);
SpUtils.saveAreaTreeMd5(md5);
//数据保存到本地
String retData = GsonUtils.objectToJson(areaData);
SpUtils.saveAreaTreeData(retData);
}
}else {
areaDataList.addAll(areaData);
//数据保存到本地
String retData = GsonUtils.objectToJson(areaData);
SpUtils.saveAreaTreeData(retData);
}
if (iGetAreaRevealListener != null) {
iGetAreaRevealListener.onSuccess(areaDataList);
}
}
/**
* 保存地区
*/
public void saveAreaData(LaunchPageBean.AreasBean bean){
if (bean != null){
String md5 = bean.getMd5();
String areaTreeMd5 = SpUtils.getAreaTreeMd5();
//md5 不同或者文件不存在,更新
if (!areaTreeMd5.equals(md5)||isAreasFileNoExists()){
String areasUrl = bean.getAreasUrl();
if (StringUtils.isBlank(areasUrl)){
userLocalAreaData();
}else {
//下载文件
if (StringUtils.isNotBlank(areasUrl)){
//异步下载
downloadAreasUrl(areasUrl,md5);
}
}
}else {
userLocalAreaData();
}
}else {
userLocalAreaData();
}
}
/**
* 保存区域文件,enqueue异步,execute同步
* @param areasUrl
*/
public void downloadAreasUrl(String areasUrl, String md5){
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(areasUrl).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失败读取缓存
userLocalAreaData();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = null;
try {
is = response.body().byteStream();
String fileName = getCachePath(AREAS_FILE_NAME);
String tempFileName = "";
if(fileName.contains(".")){
tempFileName = fileName.substring(0,fileName.lastIndexOf("."))+".temp";
}
File file = new File(TextUtils.isEmpty(tempFileName) ? fileName : tempFileName);
fos = new FileOutputStream(file);
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
if(!TextUtils.isEmpty(tempFileName)){
file.renameTo(new File(fileName));
}
//然后读取文件内容添加到
readAreasFile(md5);
} catch (Exception e) {
e.printStackTrace();
//失败读取缓存
userLocalAreaData();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
}
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
}
}
}
});
}
private void readAreasFile(String md5){
File areasFile = getAreasFile();
if (areasFile != null && areasFile.exists()){
String readJsonData = MyFileUtils.readJsonFile(areasFile);
if (StringUtils.isNotBlank(readJsonData)){
try {
byte[] bytes = readJsonData.getBytes("iso-8859-1");
String result = new String(bytes, "utf-8");
JSONObject jsonObject = JSONObject.parseObject(result);
if (jsonObject != null) {
JSONArray jsonArray = jsonObject.getJSONArray("data");
//解析成功之后
List<AreaTreeselectBean> areaDataList = GsonUtils.jsonToArrayList(jsonArray.toString(), AreaTreeselectBean.class);
SpUtils.saveAreaTreeMd5(md5);
//数据保存到本地
String retData = GsonUtils.objectToJson(areaDataList);
SpUtils.saveAreaTreeData(retData);
if (iGetAreaRevealListener != null) {
iGetAreaRevealListener.onSuccess(areaDataList);
}
}
} catch (Exception e) {
e.printStackTrace();
userLocalAreaData();
}
}
}
}
/**
* 文件是否不存在
* @return true 不存在, false存在
*/
public boolean isAreasFileNoExists(){
try {
File tempFile = getAreasFile();
return !tempFile.exists();
}catch (Exception e){
e.printStackTrace();
}
return true;
}
private File getAreasFile(){
String appCachePath = AppContext.getContext().getCacheDir().getAbsolutePath();
File tempFile = new File(appCachePath, AREAS_FILE_NAME);
return tempFile;
}
private static String getCachePath(String fileName) {
return new File(AppContext.getContext().getCacheDir(), fileName).getAbsolutePath();
}
/**
* 使用缓存
*/
private void userLocalAreaData(){
List<AreaTreeselectBean> areaDataList = new ArrayList<>();
areaDataList.addAll(getLocalAreaData());
if (iGetAreaRevealListener != null) {
iGetAreaRevealListener.onSuccess(areaDataList);
}
}
/**
* 获取二级地理数据, 省 -->市;直辖市 --->区
*/
public void getTreeList(){
Observable<BaseResponse<List<AreaTreeselectBean>>> phoneCode = getRetrofit().getTreeList();
request(phoneCode, new BaseObserver<List<AreaTreeselectBean>>() {
@Override
protected void dealSpecialCode(int code, String message) {
if (iGetTwoAreaRevealListener != null) {
iGetTwoAreaRevealListener.onFailed(message);
}
}
@Override
protected void onSuccess(List<AreaTreeselectBean>areaDatas) {
if (iGetTwoAreaRevealListener != null) {
iGetTwoAreaRevealListener.onSuccess(areaDatas);
}
}
@Override
public void _onError(String e) {
if (iGetTwoAreaRevealListener != null) {
iGetTwoAreaRevealListener.onFailed(e);
}
}
});
}
public interface IGetAreaRevealListener extends IVMCallback {
/**
* 成功
*
*/
void onSuccess(List<AreaTreeselectBean> datas);
/**
* 失败
*
* @param error 错误信息
*/
void onFailed(String error);
}
}