带有 AA 和 Retrofit 的 Model View Presenter,不获取数据

Model View Presenter with AA and Retrofit, not get data

我尝试使用 AndroidAnnotations 和 Retrofit2 在 Android 中做一个简单的 MVP, 但是我从来没有得到信息。

代码主持人:

public class ListHomePresenter {


private List<Post> mPost;
Client client;
int error_code = 0;
String error_msg = "";

/**
 * TODO: get all post
 * */
public List<Post> getPost() throws SampleExceptions{
    RestService restService;
    client = new Client();
    restService = client.getApi();

    Call<List<Post>> task = restService.downloadPost();

    task.enqueue(new Callback<List<Post>>() {
        @Override
        public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
            mPost = response.body();
        }

        @Override
        public void onFailure(Call<List<Post>> call, Throwable t) {
            mPost = null;

            error_code = 1; // error
            error_msg = t.getMessage(); // message
        }
    });

    if(error_code == 1 )
        throw new SampleExceptions(error_code, "Error");

    return mPost;
}

}

代码Activity

@EActivity(R.layout.activity_home)

public class 主页Activity 扩展 AppCompatActivity {

@ViewById(R.id.rvPosts)
RecyclerView mRvPost;

PostAdapter mPostAdapter;

ListHomePresenter mListHomePresenter;

private StaggeredGridLayoutManager gaggeredGridLayoutManager;

@AfterViews
void setupHome(){
    downloadPost();
}


@UiThread(propagation = Propagation.REUSE)
void downloadPost(){
    try{
        mListHomePresenter = new ListHomePresenter();
        gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1);
        mRvPost.setLayoutManager(gaggeredGridLayoutManager);
        mPostAdapter = new PostAdapter(HomeActivity.this, mListHomePresenter.getPost());
        mRvPost.setAdapter( mPostAdapter );

    }catch (SampleExceptions e){

    }
}

}

但是,我得到的是空数据。

帮帮我!

您的 getPost 方法存在竞争条件,当 return mPost 时,回调尚未 return 编辑响应。

我建议 getPost 方法不要 return 任何东西,一旦你传递 onResponse,你就调用一个填充适配器的视图方法。

这可确保您始终拥有数据。

举个例子:

主持人:

    public class ListHomePresenter {

        private List<Post> mPost;
        Client client;
        int error_code = 0;
        String error_msg = "";
        HomeView view;

        public ListHomePresenter(HomeView view) {
          this.view = view;
        }

        /**
         * TODO: get all post
         * */
        public void loadPost() throws SampleExceptions{
            RestService restService;
            client = new Client();
            restService = client.getApi();

            Call<List<Post>> task = restService.downloadPost();

            task.enqueue(new Callback<List<Post>>() {
                @Override
                public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
                    view.retrieveData(response.body());
                }

                @Override
                public void onFailure(Call<List<Post>> call, Throwable t) {
                    mPost = null;

                    error_code = 1; // error
                    error_msg = t.getMessage(); // message
                }
            });

            if(error_code == 1 )
                throw new SampleExceptions(error_code, "Error");
        }

}

Activity:

@ViewById(R.id.rvPosts)
RecyclerView mRvPost;

PostAdapter mPostAdapter;

ListHomePresenter mListHomePresenter;

private StaggeredGridLayoutManager gaggeredGridLayoutManager;

@AfterViews
void setupHome() {
    downloadPost();
}


@UiThread(propagation = Propagation.REUSE)
void downloadPost() {
    try {
        mListHomePresenter = new ListHomePresenter(this);
        mListHomePresenter.loadPost()
    } catch (SampleExceptions e) {

    }
}

// Method implemented from view interface
@Override
void retrieveData(List<Post> postList) {
  gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1);
  mRvPost.setLayoutManager(gaggeredGridLayoutManager);
  mPostAdapter = new PostAdapter(HomeActivity.this, postList);
  mRvPost.setAdapter(mPostAdapter);
}

只需要实现一个接口视图就可以在两个类

之间进行交互