Почему retrofit слишком медленно извлекает данные из веб-службы asp

#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. Да, это то же самое с разными устройствами