2017-05-31 38 views
0

我試圖在Android中使用AndroidAnnotations和Retrofit2, 做一個簡單的MVP但我從來沒有得到的信息。模型視圖演示者與AA和改造,而不是獲取數據

代碼演示

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; 
} 

}

代碼活動

@EActivity(R.layout.activity_home) 

公共類HomeActivity延伸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){ 

    } 
} 

}

但是,我得到空數據。

幫幫我!

回答

1

下面的例子:

主持人:

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"); 
     } 

} 

活動:

@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); 
} 

只有你需要實現一個接口以兩個類之間的交互

+1

你可以看到這個例子來闡明[Android MVP](https://github.com/antoniolg/androidmvp)的概念 –

+0

如何使用我的界面方法演示者功能?我實例化,但得到錯誤 –

+1

在演示器構造器中設置視圖界面 –

1

您的getPost方法有競爭條件,當返回mPost時,回調尚未返回響應。

我建議getPost方法不返回任何內容,並且一旦你傳遞onResponse,就調用一個視圖方法來填充適配器。

這可確保您始終擁有數據。

+0

你需要有一個如MVP模式中定義的那樣在當前和活動之間進行交互。 –

+0

非常感謝! –

+0

我通過RecyclerView和上下文作爲參數來填充它。沒關係?我剛剛開始在MVP –

相關問題