2017-04-26 62 views
0

在MVP安卓我相信网络层(改造,抽气等)不应该分开的模型。但是,我需要一个关于如何构建模型的实例。模型应该是网络层在api调用完成时创建的单例吗?android MVP - 从模型中应该如何调用网络层?

让我们看一个主持人,我有我的我的活动之一:

public class MainActivityPresenter implements IMainPresenterContract, Callback { 

    IMainActivityViewContract view;//todo set up a weak reference to View to avoid leakage 
    NewsService interactor; 

    public MainActivityPresenter(IMainActivityViewContract view, NewsService interactor) { 
     this.view = view; 
     this.interactor = interactor; 
    } 


    public void loadResource() { 
     interactor.loadResource(); 
    } 


    public void onRequestComplete(final NewsEntities newsEntities) { 

     view.dataSetUpdated(newsEntities.getResults()); 
    } 

    @Override 
    public void onResult(final NewsEntities newsEntities) { 
     onRequestComplete(newsEntities); 
    } 

    public void goToDetailsActivity(Result result) { 
     view.goToDetailsActivity(result); 
    } 
} 

所以我的问题是关于NewsService交互器参数我传递到构造函数。我假设这应该是模型数据而不是网络服务。但是,它应该是什么样子?目前我的看起来是这样的:

public class NewsService implements INewsServiceContract { 

    private Gson gson; 
    private Callback mCallback; 


    public NewsService() { 
     configureGson(); 
    } 

    private static String readStream(InputStream in) { 
     StringBuilder sb = new StringBuilder(); 
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { 

      String nextLine; 
      while ((nextLine = reader.readLine()) != null) { 
       sb.append(nextLine); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 

    public void setCallBack(Callback cb) { 
     mCallback = cb; // or we can set up event bus 
    } 

    private void configureGson() { 


     GsonBuilder builder = new GsonBuilder(); 
     builder.excludeFieldsWithoutExposeAnnotation(); 
     gson = builder.create(); 
    } 

    @Override 
    public void loadResource() { 
//Todo could use a loader instead help with the config change or a headless fragment 
     new AsyncTask<String, String, String>() { 
      @Override 
      protected String doInBackground(String... params) { 
       String readStream = ""; 
       HttpURLConnection con = null; 
       try { 
        URL url = new URL("https://api.myjson.com/bins/nl6jh"); 
        con = (HttpURLConnection) url.openConnection(); 
        readStream = readStream(con.getInputStream()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       finally { 
        if(con!=null) 
        con.disconnect(); 
       } 
       return readStream; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 
       NewsService.this.onRequestComplete(result); 


      } 
     }.execute(); 
    } 

    private void onRequestComplete(String data) { 

     data = data.replaceAll("\"multimedia\":\"\"", "\"multimedia\":[]"); 
     news.hotels.com.sample.Model.NewsEntities newsEntities = gson.fromJson(data, NewsEntities.class); 
     mCallback.onResult(newsEntities); 
    } 
} 

所以你可以看到NewsService在这种情况下正在做网络调用。我想我不应该把这个传递给主持人。但是,如何构建模型呢?谁调用了NewsService?

回答

1

网络调用需要位于模型层,并且应该由演示者触发。

我自己使用一个交互类来做到这一点,这是在模型层,并且演示者将使用这个交互者来执行api调用。

演示者实际上是您的业务层。看看这个示例项目在我的回购:

https://gitlab.com/amirziarati/Echarge

我用匕首做DI可能会迷惑你。只要看看包装和我如何分开层之间的关注。

+0

我无法查看您的项目。我成功注册了一个gitlab帐户,但它无法看到任何源代码。它是一个空的项目。 – j2emanue

+0

虐待检查它 –

+0

我把它公开;)再看看 –