package com.application.zhangshi_app_android.ui.function; import static com.android.app_base.base.BaseConfig.CODE_SUCCESS; import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.MutableLiveData; import com.android.app_base.base.StateViewEnum; import com.android.app_base.base.viewmodel.BaseViewModel; import com.android.app_base.http.ResultData; import com.android.app_base.manager.AppManager; import com.android.app_base.utils.RxUtils; import com.android.app_base.utils.ToastUtils; import com.android.app_base.utils.rxbus.MessageEvent; import com.android.app_base.utils.rxbus.RxBus; import com.application.zhangshi_app_android.bean.ContactsDetailBean; import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean; import com.application.zhangshi_app_android.bean.UploadFileResponseBean; import com.application.zhangshi_app_android.data.DataRepository; import com.blankj.utilcode.util.ImageUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Action; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; /** * @author Ljj * @date 2023.08.01. 13:45 * @desc 通讯录导入 Activity ViewModel */ public class ContactsImportActivityViewModel extends BaseViewModel { public ContactsImportActivityViewModel(@NonNull Application application) { super(application); } @Override protected DataRepository initModel() { return DataRepository.getInstance(); } //添加联系人 public void addContacts(List data) { // 创建一个集合,用于保存所有接口请求的 Observable List>> observables = new ArrayList<>(); for (ContactsDetailBean bean : data) { Observable> addObservable; if (bean.getUrl() == null || bean.getUrl().isEmpty()) { addObservable = model.addContacts(bean); }else { if (bean.getPhotoData() == null || bean.getPhotoData().length == 0) { addObservable = model.addContacts(bean); }else { //将图片字节数组bean.getPhotoData()转换为文件 File file; try { file = new File(AppManager.getAppManager().currentActivity().getCacheDir(), "head_photo"); // 将头像字节数组写入文件 FileOutputStream fos = new FileOutputStream(file); fos.write(bean.getPhotoData()); fos.flush(); fos.close(); } catch (IOException e) { throw new RuntimeException(e); } ImageUtils.ImageType type = ImageUtils.getImageType(file); File newFile = new File(file.getAbsolutePath()+"."+type.getValue()); file.renameTo(newFile); RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), newFile); MultipartBody.Part body = MultipartBody.Part.createFormData("uploadFile", newFile.getName(), requestBody); // 将每个接口请求添加到 observables 集合中 Observable> uploadObservable = model.uploadFile(body); addObservable = uploadObservable.flatMap(resultData -> { bean.setUrl(resultData.getData().getUrl()); return model.addContacts(bean); }); } } observables.add(addObservable); } // 使用 Observable.zip 将所有接口请求合并为一个 Observable Observable.zip(observables, results -> results) .compose(RxUtils.schedulersTransformer()) .doOnSubscribe(disposable -> { // 在订阅时展示加载对话框 changeStateView(StateViewEnum.DIALOG_LOADING); }) .doFinally(() -> { // 在所有接口请求完成后关闭加载对话框 changeStateView(StateViewEnum.DIALOG_DISMISS); }).subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { addSubscribe(d); } @Override public void onNext(Object[] objects) { for (Object result : objects) { if (result instanceof ResultData) { ResultData data = (ResultData) result; if (data.getCode() == CODE_SUCCESS) { ToastUtils.showShort("导入成功"); RxBus.getInstance().post(new MessageEvent(MessageEvent.EVENT_REFRESH_DATA)); AppManager.getAppManager().finishCurrentActivity(); } else { messageLiveData.postValue(data.getMsg()); } } } } @Override public void onError(Throwable e) { messageLiveData.postValue(e.getMessage()); } @Override public void onComplete() { } }); } }