#android #retrofit #rx-java #mvp #android-mvp
#Android #модернизация #rx-java #mvp #android-mvp
Вопрос:
Я написал приложение для Android, но оно слишком медленно извлекает данные с сервера. Я использовал rxjava и retrofit для извлечения данных, а веб-сервисы были написаны asp.net пожалуйста, скажите мне, что мне делать Я проверил веб-службы с помощью postman, и они работают нормально и быстро пожалуйста, просмотрите мои коды и скажите мне, что с ними не так это мои коды: Фрагмент:
public class HomeFragment extends BaseFragment implements HomeContract.View {
private HomeContract.Presenter presenter;
private SliderView slider;
private TextView txt_homeFragment_showAllNew,
txt_homeFragment_showAllTopSelling,
txt_homeFragment_showAllHits;
private RecyclerView rv_homeFragment_newProduct,
rv_homeFragment_topSelling,
rv_homeFragment_hits,
rv_homeFragment_specialOffer;
private Button btn_homeFragment_showAllSpecial;
private HomeRecyclerAdapter adapter;
private Fragment fragment;
private FragmentTransaction transaction;
private Bundle bundle;
@SuppressLint("StaticFieldLeak")
private Dialog myDialog;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
String pls = getResources().getString(R.string.please_wait);
String loading = getResources().getString(R.string.loading);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = new HomePresenter(new TCommerceRepository(),getViewContext());
if(MainFragment.checkInternet) {
presenter.getNewProduct();
presenter.getHitsProduct();
presenter.getSlider();
}
}
@Override
public int getLayout() {
return R.layout.fragment_home;
}
@Override
public void setupViews() {
myDialog = new Dialog(getContext());
myDialog.setContentView(R.layout.dialog_alert);
TextView txtTitle = myDialog.findViewById(R.id.txt_alertDialog_title);
TextView txtMessage = myDialog.findViewById(R.id.txt_alertDialog_message);
String pls = getResources().getString(R.string.please_wait);
String loading = getResources().getString(R.string.loading);
txtTitle.setText(loading);
txtMessage.setText(pls);
myDialog.getWindow().setLayout(1000,500);
slider = rootView.findViewById(R.id.slider_homeFragment_slideShow);
txt_homeFragment_showAllNew = rootView.findViewById(R.id.txt_homeFragment_showAllNew);
txt_homeFragment_showAllTopSelling = rootView.findViewById(R.id.txt_homeFragment_showAllTopSelling);
txt_homeFragment_showAllHits = rootView.findViewById(R.id.txt_homeFragment_showAllHits);
rv_homeFragment_newProduct = rootView.findViewById(R.id.rv_homeFragment_newProduct);
rv_homeFragment_topSelling = rootView.findViewById(R.id.rv_homeFragment_topSelling);
rv_homeFragment_hits = rootView.findViewById(R.id.rv_homeFragment_hits);
rv_homeFragment_specialOffer = rootView.findViewById(R.id.rv_homeFragment_specialOffer);
btn_homeFragment_showAllSpecial = rootView.findViewById(R.id.btn_homeFragment_showAllSpecial);
txt_homeFragment_showAllNew.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bundle = new Bundle();
bundle.putInt("flag",1);
fragment = new StockListFragment();
fragment.setArguments(bundle);
transaction = Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frm_mainFragment_mainLayout, fragment);
transaction.commit();
}
});
txt_homeFragment_showAllTopSelling.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bundle = new Bundle();
bundle.putInt("flag",2);
fragment = new StockListFragment();
fragment.setArguments(bundle);
transaction = Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frm_mainFragment_mainLayout, fragment);
transaction.commit();
}
});
txt_homeFragment_showAllHits.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bundle = new Bundle();
bundle.putInt("flag",3);
fragment = new StockListFragment();
fragment.setArguments(bundle);
transaction = Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frm_mainFragment_mainLayout, fragment);
transaction.commit();
}
});
}
@Override
public Context getViewContext() {
return getContext();
}
@Override
public void showMessage(String msg) {
Log.i("LOG::::" , msg);
}
@Override
public void onStart() {
super.onStart();
presenter.attachView(this);
}
@Override
public void onStop() {
super.onStop();
presenter.detachView();
}
@Override
public void showNewProduct(StockListModel list) {
adapter = new HomeRecyclerAdapter(getViewContext() , list);
rv_homeFragment_newProduct.setLayoutManager(new LinearLayoutManager(getViewContext() , RecyclerView.HORIZONTAL , false));
rv_homeFragment_newProduct.setAdapter(adapter);
}
@Override
public void showTopSellProduct(StockListModel list) {
adapter = new HomeRecyclerAdapter(getViewContext() , list);
rv_homeFragment_topSelling.setLayoutManager(new LinearLayoutManager(getViewContext() , RecyclerView.HORIZONTAL , false));
rv_homeFragment_topSelling.setAdapter(adapter);
}
@Override
public void showHitsProduct(StockListModel list) {
adapter = new HomeRecyclerAdapter(getViewContext() , list);
rv_homeFragment_hits.setLayoutManager(new LinearLayoutManager(getViewContext() , RecyclerView.HORIZONTAL , false));
rv_homeFragment_hits.setAdapter(adapter);
if (myDialog.isShowing()){
myDialog.dismiss();
}
}
@Override
public void showSlider(ItemImageSlider itemImageSlider) {
if ((myDialog.isShowing())){
myDialog.dismiss();
} else {
myDialog.show();
}
TimerTask task = slider.getTimerTask();
Timer timer = new Timer();
timer.schedule(task,5000,2000);
ArrayList<String> urls = new ArrayList<>();
for (int i = 0; i < itemImageSlider.getItems().size(); i ) {
urls.add(itemImageSlider.getItems().get(i).getIcon());
}
slider.setUrls(urls);
}
}
Ведущий:
public class HomePresenter implements HomeContract.Presenter {
private HomeContract.View view;
private TCommerceDataSource tCommerceDataSource;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private Context context;
HomePresenter (TCommerceDataSource tCommerceDataSource,Context context){
this.tCommerceDataSource = tCommerceDataSource;
this.context = context;
}
@Override
public void attachView(HomeContract.View view) {
this.view = view;
}
@Override
public void detachView() {
this.view = null;
if (compositeDisposable != null){
compositeDisposable.clear();
}
}
@Override
public void getNewProduct() {
tCommerceDataSource.getListStockNew().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<StockListModel>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onSuccess(StockListModel productList) {
view.showNewProduct(productList);
view.showTopSellProduct(productList);
}
@Override
public void onError(Throwable e) {
view.showMessage(e.toString());
}
});
}
@Override
public void getHitsProduct() {
tCommerceDataSource.getListStockBestView().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<StockListModel>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onSuccess(StockListModel stockListModel) {
view.showHitsProduct(stockListModel);
}
@Override
public void onError(Throwable e) {
view.showMessage(e.toString());
}
});
}
@Override
public void getSlider() {
tCommerceDataSource.getSlideImage().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<ItemImageSlider>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onSuccess(ItemImageSlider itemImageSlider) {
view.showSlider(itemImageSlider);
}
@Override
public void onError(Throwable e) {
view.showMessage(e.toString());
}
});
}
}
и это мой клиент Okhttp и перехватчик:
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(6 , TimeUnit.MINUTES)
.readTimeout(6 , TimeUnit.MINUTES)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.build();
return chain.proceed(request);
}
}).build();
return httpClient;
Как я должен использовать Interceptor?
Что я должен изменить?
Комментарии:
1. почему бы не использовать перехватчик, чтобы увидеть время отклика и другую информацию?
2. Я использовал interceptor. Как я должен видеть время отклика и другую информацию?
Ответ №1:
Пример использования (не ответ — просто для отладки)
public class LoginInterceptor extends Interceptor {
private static final String TAG = LoginInterceptor.class.getSimpleName() " : ";
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Log.i(TAG, String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Log.d(TAG, String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
и добавьте это в client
.addNetworkInterceptor(новый LoginInterceptor())
Комментарии:
1. проблема с приложением или сервером?: 2020-08-16 17:24:48.153 15571-15654/ com.intechdev.tcommerce D / Inter: Получен ответ для tc.intechserver.ir/wservice / … за 24216,3 мс Управление кэшем: без кэша Прагма: без кэша, без кэша Тип содержимого: application / json; кодировка = utf-8 Кодировка содержимого: gzip Срок действия: -1 Сервер: Microsoft-IIS / 8.5 X-AspNet-Версия: 4.0.30319 Набор файлов cookie: ASP.NET_SessionId=yy2xlvydmh4dyramwv1z053f; путь =/; HttpOnly; SameSite=Слабый контроль доступа-Разрешить-Источник: *
2. пожалуйста, удалите api из приведенного выше комментария, если это важно, теперь, что касается запроса, вывод ответа представляет собой очень большой json, но он не должен занимать 24216,3 мс, как вы упомянули выше. Протестируйте API в клиентском приложении Postman в Windows.
3. Я протестировал это в post man. но ответ такой быстрый
4. Получили ли вы одинаковый результат при тестировании на разных устройствах или эмуляторе
5. Да, это то же самое с разными устройствами