2017-09-28 5 views
0

Je suis nouveau sur le développement Android et j'apprends comment utiliser le modèle MVP correctement récemment.Comment concevoir une classe qui peut transmettre des données à partir du serveur lorsque les données sont finis de téléchargement

Maintenant, je suis confronté à un problème délicat, l'espoir peut obtenir une suggestion utile ou une solution d'ici.

Tout d'abord, voici mon présentateur

public class MVPPresenter { 

    private MVPView mvpView; 

    public MVPPresenter(MVPView mvpView) { 
     this.mvpView = mvpView; 
    } 

    public void loadData() { 
     mvpView.startLoading(); 
     final List<MVPModel> list = new ArrayList<>(); 
     //the part that I trying to extract starts here. 
     Call call = DataRetriever.getDataByGet(URLCombiner.GET_FRONT_PAGE_ITEMS); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       mvpView.errorLoading(); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       if (response.isSuccessful()) { 
        try { 
         JSONObject result = new JSONObject(response.body().string()); 
         int errorCode = result.getInt("ErrorCode"); 
         if (errorCode == 0) { 
          JSONArray value = result.getJSONObject("Value").getJSONArray("hot"); 
          for (int i = 0; i < value.length(); i++) { 
           MVPModel mvpModel = new MVPModel(); 
           String name = null; 
           String image = null; 
           try { 
            name = value.getJSONObject(i).getString("title"); 
            image = URLCombiner.IP + value.getJSONObject(i).getString("pic"); 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 
           mvpModel.setName(name); 
           mvpModel.setImage(image); 
           list.add(mvpModel); 
          } 
          if (list.size() > 0) { 
           mvpView.successLoading(list); 
           mvpView.finishLoading(); 
          } else { 
           mvpView.errorLoading(); 
          } 
         } else { 
          mvpView.errorLoading(); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } else { 
        mvpView.errorLoading(); 
       } 
      } 
     }); 
     //the part that I trying to extract ends here. 
    } 
} 

Comme vous pouvez le voir, je suis en train d'extraire la partie qui utilise OKHttp libs dans une classe (je l'appelle gestionnaire de données) que je l'espère peut gérer chaque tâche entre le serveur et le client. Mais voici la chose, quand j'essaye de passer le résultat du gestionnaire de données au présentateur, j'ai obtenu NullPointException à cause du mécanisme asynchrone.

Je voudrais savoir comment transmettre les données, qui proviennent du serveur en asynchrone, au présentateur lorsque les données ont fini de télécharger.

Et voici mon gestionnaire de données idéal, je sais que cela peut sembler stupide mais je pense que cela peut rendre mon problème plus clair. J'ai lu un article qui pourrait peut-être résoudre mon problème, mais je n'ai toujours pas trouvé de réponse satisfaisante. Peut-être que j'ai utilisé un mauvais mot-clé, je pense. J'espère que vous pourrez me donner des idées ou des solutions pour m'aider ou m'inspirer.

P.S. version de OKhttp libs est 3.7.0

Répondre

0

Créer une Listener simple, il peut être appelé à chaque fois que les finitions d'appel du serveur:

public class LoadServerData { 

    public static interface Listener { 
     public void onSuccess(JSONArray data); 
     public void onError(Exception error); 
    } 

    public static void getServerData(Listener listener) { 
     Call call = DataRetriever.getDataByGet(URLCombiner.GET_FRONT_PAGE_ITEMS); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       listener.onError(e); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       if (response.isSuccessful()) { 
        try { 
         JSONObject result = new JSONObject(response.body().string()); 
         int errorCode = result.getInt("ErrorCode"); 
         if (errorCode == 0) { 
          JSONArray arrayData = result.getJSONObject("Value").getJSONArray("hot"); //the data I would like to return. 
          listener.onSuccess(arrayData); 
         } else { 
          listener.onError(...); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
         listener.onError(e); 
        } 
       } else { 
        listener.onError(...); 
       } 
      } 
     }); 
    } 
} 
+0

Cela fonctionne comme un charme. Merci pour votre aide: D – Lucian

+0

De rien! Cependant, envisagez de modifier votre conception de sorte que 'getServerData' ne soit pas une méthode statique. Cela rendra votre code plus facile à tester – Pelocho

+0

Merci encore pour votre avis. Je l'ai changé. Très apprécié. – Lucian