Android 改造调用不良行为

Android retrofit call bad behavior

美好的一天,我的问题如下。 当我初始化改造调用时,它有以下流程。

1。在Presenterclass中,它转到getData方法。

2。然后它转到 Interactorclass 并创建它自己的一个实例。

3。然后开始从getMovieList方法中获取数据。

4。当它到达 call.enqueue 时,它说 OnDataCallback 为空。

5。返回到 Presenter 和 returns 空值 List

6。它恢复 call.enqueue 根据需要执行 api 调用。

7.Returns 到 Presenter 和 returns 对象的 List.

我尝试了很多方法,但似乎都不起作用,也许我理解有误,如有任何帮助,我们将不胜感激。

互动者 Class.

public class MovieListInteractor implements IMovieContarctor.MovieListInteractor {

    private InteractorListener mListener;
    private List<MovieListModel> mList;

    public MovieListInteractor(InteractorListener mListener) {
        this.mListener = mListener;
    }

    public int getMovieSize() {
        return mList.size();
    }

    @Override
    public String getMoviePosterPath(int pos) {
        return mList.get(pos).getPosterPath();
    }

    @Override
    public MovieListModel getMovie(int pos) {
        return mList.get(pos);
    }

    @Override
    public List<MovieListModel> getMovieList() {
        if (mList == null)
            mList = new ArrayList<>();
        ServerMovieCall mCall = new ServerMovieCall();
        mCall.getMovieList(new IOnDataCallback<List<MovieListModel>>() {
            @Override
            public void onSuccess(List<MovieListModel> data) {
                mList.addAll(data);
            }

            @Override
            public void onFailure(String message) {
                Log.d(TAG, "onFailure: " + message);
            }
        });
        return mList;
    }
}

主持人 class

public class MovieListPresenter implements IMovieContarctor.MovieListPresenter, InteractorListener {

    private MovieListFragment mView;
    private MovieListInteractor mInteractor;
    private List<MovieListModel> mList;

    public MovieListPresenter(MovieListFragment mView) {
        this.mView = mView;
        mInteractor = new MovieListInteractor(this);
        getData();

    }

    //TODO: Add functionality so that the view could call mView.refreshAdapterList
    //TODO: And from the view - adapter.notifiyDataSetChange;

    @Override
    public void onSuccess(List<MovieListModel> data, String msg) {
        mView.onDataChange(data, msg);
    }

    @Override
    public void onFailure(String msg) {
        mView.onDataFailure(msg);
    }

    @Override
    public void bindAtPosition(int position, MovieListViewHolder holder) {
        holder.setValue(mInteractor.getMovie(position));
    }

    @Override
    public void getData() {
        mList = mInteractor.getMovieList();
    }

    @Override
    public String getMoviePosterPath(int pos) {
        return mInteractor.getMoviePosterPath(pos);
    }

    @Override
    public int getSize() {
        return mInteractor.getMovieSize();
    }
}

适配器

public class MovieListAdapter extends RecyclerView.Adapter<MovieListViewHolder> {
    private MovieListPresenter mPresenter;
    private Context ctx;

    public MovieListAdapter(MovieListPresenter mPresenter, Context context) {
        this.mPresenter = mPresenter;
        this.ctx = context;
    }

    @Override
    public MovieListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MovieListViewHolder(LayoutInflater.from(ctx).inflate(R.layout.main_view_movie_list, parent, false));
    }

    @Override
    public void onBindViewHolder(MovieListViewHolder holder, int position) {
        mPresenter.bindAtPosition(position, holder);
        String image_url = IMAGE_URL_BASE_PATH + mPresenter.getMoviePosterPath(position);
        Picasso.with(ctx).load(image_url).placeholder(android.R.drawable.sym_def_app_icon)
                .error(android.R.drawable.sym_def_app_icon).into(holder.mImage);
    }

    @Override
    public int getItemCount() {
        return mPresenter.getSize();
    }
}

MovieCall class

public class ServerMovieCall {
    private Retrofit retrofit;
    private static ServerMovieCall mInstance;
    private Context ctx;

    public static ServerMovieCall getInstance() {
        if (mInstance == null) {
            mInstance = new ServerMovieCall();
        }
        return mInstance;
    }

    public ServerMovieCall() {
        configureClient();
    }

    private void configureClient() {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                HttpUrl url = request.url().newBuilder().addQueryParameter("api_key", Constants.API_KEY).build();
                request = request.newBuilder().url(url).build();

                return chain.proceed(request);
            }
        }).build();

        retrofit = new Retrofit.Builder().baseUrl(Constants.API_BASE_URL).client(client)
                .addConverterFactory(GsonConverterFactory.create()).build();
    }

    public void getMovieList(final IOnDataCallback<List<MovieListModel>> onDataCallback) {
        IServerMovieApiHelper iMovieReviewApiService = retrofit.create(IServerMovieApiHelper.class);
        Call<MovieListResponse> call = iMovieReviewApiService.getMovieList();
        call.enqueue(new Callback<MovieListResponse>() {
            @Override
            public void onResponse(Call<MovieListResponse> call, Response<MovieListResponse> response) {
                if (response.isSuccessful()) {
                    onDataCallback.onSuccess(response.body().getMovies());
                } else {
                    onDataCallback.onFailure(response.message());
                }
            }

            @Override
            public void onFailure(Call<MovieListResponse> call, Throwable t) {
                onDataCallback.onFailure(t.getLocalizedMessage());
            }
        });
    }

合同接口

public interface IMovieContarctor {
    public interface MovieListInteractor {
        List<MovieListModel> getMovieList();

        MovieListModel getMovie(int pos);

        String getMoviePosterPath(int pos);
    }

    public interface MovieListPresenter {
        void bindAtPosition(int position, MovieListViewHolder holder);

        String getMoviePosterPath(int pos);

        int getSize();

        void getData();
    }

    public interface MovieListView {
        void onDataChange(List<MovieListModel> data, String message);

        void onDataFailure(String message);
    }
}

DataCallback 侦听器。

public interface IOnDataCallback<T> {
    void onSuccess(T data);
    void onFailure(String message);
}

交互器中 class:

@Override
public List<MovieListModel> getMovieList() {
    if (mList == null)
        mList = new ArrayList<>();
    ServerMovieCall mCall = new ServerMovieCall();
    mCall.getMovieList(new IOnDataCallback<List<MovieListModel>>() {
        @Override
        public void onSuccess(List<MovieListModel> data) {
            mList.addAll(data);
            mListener.onSuccess(mList, "Your message");
        }

        @Override
        public void onFailure(String message) {
            Log.d(TAG, "onFailure: " + message);
        }
    });
    return mList;
}

演示者中 class:

@Override
public void onSuccess(List<MovieListModel> data, String msg) {
    mList = data;
    mView.onDataChange(data, msg);
}