2017-04-23 29 views
2

整数データ数を取得する次のコードがあります。 getData(NewsSettings)メソッドは3を返します。ボタンをクリックすると、アプリケーションには私にNo new news foundと表示されます。呼び出されたメソッドの前に実行されるトースト

なぜgetDataの前にトーストを実行するのですか?

は、私は完全onCreategetDataメソッドを追加した

を更新しました。私は実行すると、それは、No new news found私を示し、その後Inside Responseその後、Data count = 3

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_profile); 
    assert getSupportActionBar() != null; 
    getSupportActionBar().setTitle(R.string.action_profile); 

    pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    Button button = (Button) findViewById(R.id.buttonBuilder); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      newsSettings = new NewsSettings(); 
      newsSettings.setPreferredCity(pref.getString("prefCity", "")); 
      int dataCount = getData(newsSettings); 
      if(dataCount > 0) 
       Toast.makeText(getApplicationContext(), dataCount + " new news found", Toast.LENGTH_SHORT).show(); 
      else 
       Toast.makeText(getApplicationContext(), "No new news found", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

private int getData(NewsSettings newsSettings) { 
    final int[] data = {0}; 

    RequestInterface requestInterface = RequestHelper.getInstance().getRequest(); 

    ServerRequest request = new ServerRequest(); 
    request.setOperation("dataCount"); 
    request.setNewsSettings(newsSettings); 

    Call <ServerResponse> response = requestInterface.operation(request); 

    response.enqueue(new Callback <ServerResponse>() { 
     @Override 
     public void onResponse(Call <ServerResponse> call, 
           retrofit2.Response <ServerResponse> response) { 
      ServerResponse resp = response.body(); 
      Toast.makeText(getApplicationContext(), "Inside Response", Toast.LENGTH_SHORT).show(); 

      if(resp.getResult().equals(Constants.SUCCESS)) { 
       data[0] = resp.getNewsSettings().getDataCount(); 
       Toast.makeText(getApplicationContext(), "Data count = " + data[0], Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Call <ServerResponse> call, Throwable t) { 
      Log.d(Constants.TAG,"failed"); 
      Toast.makeText(getApplicationContext(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
    return data[0]; 
} 
+0

を表示することができ、このようなdisplayDataCount()と呼ばれる別のメソッドを作成するには、しようとしましたそれをデバッグするには?トーストを書くにはdataCountは<0でなければなりません "新しいニュースが見つかりません" –

+0

私はあなたを信じていません。 getDataが実行される前にトーストが送られたという証拠はありますか? –

+0

"getData"のコードを記述し、デバッガをチェックする必要があります。これは多くのレベルで間違っていると思います。なぜなら、あなたのコードを単純化しすぎて、エラーを取り除いたり隠したりしたと思います。 Btw、ちょうど "int dataCount = 3;"で試してくださいチェックするだけですが、私は問題がgetDataメソッドであると確信しています。 – Feuby

答えて

0

正しい値、つまり0以下が返されます。なぜですか?ボタンをクリックすると、Retrofitの非同期ネットワークコールメソッドを含むgetData()メソッドが呼び出されるためです。どのdata[0]変数は、onResponse()メソッドが呼び出された後に値でいっぱいになります。

同時に、プログラムカーソルは、ボタンをクリックしたときに開始された最初の実行を完了します。

このようにコードを変更することができます。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    .... 
    .... 

    button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     newsSettings = new NewsSettings(); 
     newsSettings.setPreferredCity(pref.getString("prefCity", "")); 

     /** here is the modification **/ 
     getData(newsSettings); 
    } 

} 

そして、あなたのgetData()方法でint戻り値の型を削除し、void

private void getData(NewsSettings newsSettings) { // remove int return type 

    ..... 
    ..... 

    response.enqueue(new Callback <ServerResponse>() { 
     @Override 
     public void onResponse(Call <ServerResponse> call, 
          retrofit2.Response <ServerResponse> response) { 
      ServerResponse resp = response.body(); 
      Toast.makeText(getApplicationContext(), "Inside Response", Toast.LENGTH_SHORT).show(); 

      if(resp.getResult().equals(Constants.SUCCESS)) { 
       data[0] = resp.getNewsSettings().getDataCount(); 

      /** here is the modification ***/ 
       displayDataCount(data[0]); // call to displayCount() method 

       Toast.makeText(getApplicationContext(), "Data count = " + data[0], Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Call <ServerResponse> call, Throwable t) { 
      Log.d(Constants.TAG,"failed"); 
      Toast.makeText(getApplicationContext(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

} 

を使用し、データ数

private void displayDataCount(int dataCount) { 
    if(dataCount > 0) 
     Toast.makeText(getApplicationContext(), dataCount + " new news found", Toast.LENGTH_SHORT).show(); 
    else 
     Toast.makeText(getApplicationContext(), "No new news found", Toast.LENGTH_SHORT).show(); 

} 
0

返された値dataCountgreater than 0ある場合を確認してください。それをデバッグするか、if-elseを削除して、単一のmakeToastメソッドを使用してdataCountと表示してください。

+0

誰がmakeTextを呼び出して実行できるのですか? –

+0

前に言ったようだった。いいえ、他にはありませんが、私はそれをもっと明確にするために追加しました –