2016-05-09 2 views
-1

ハンドラを使用して1秒あたりのセルラデータレートを計算すると、コードが毎秒実行され、全体のトラフィックが計算されました。起動後の現在のトラフィックは1秒あたりの現在のデータレートを取得します。1秒あたりのデータレートを計算しますが、結果は常に同じです

現在のデータレートの値が正しくないという問題があります。これは、ブート以降、常に全体的なトラフィック全体を示しています。私は何か間違っていたかもしれない、私はまだアンドロイドで初心者です。以下のコード。

パブリッククラスMainActivityがAppCompatActivity {

private double RXOld; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 


     @Override 
     public void run() { 


      ////////////////////////Code to be executed every second//////////////////////////////////////// 

      Calendar c = Calendar.getInstance(); 
      int seconds = c.get(Calendar.SECOND); 
      double overallTraffic = TrafficStats.getMobileRxBytes(); 

      double currentDataRate = overallTraffic - RXOld; 

      TextView view1 = null; 
      view1 = (TextView) findViewById(R.id.view1); 
      view1.setText("Current Data Rate per second= " + currentDataRate); 

      double RXOld = overallTraffic; 

      handler.postDelayed(this, 1000); 
     } 
    }, 1000); 
} 
+1

'ダブルRXOld = overallTrafficあたりの現在のデータレートを与えるものと整流後の新しいコード;' ... Javaの基本...フィールド対ローカルVARそれが動作 – Selvin

答えて

1

public class MainActivity extends AppCompatActivity { 

final double [] RXOld = new double [1]; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 


     @Override 
     public void run() { 


      ////////////////////////Code to be executed every second//////////////////////////////////////// 

      Calendar c = Calendar.getInstance(); 
      int seconds = c.get(Calendar.SECOND); 
      double overallTraffic = TrafficStats.getMobileRxBytes(); 

      double currentDataRate = overallTraffic - RXOld [0]; 

      TextView view1 = null; 
      view1 = (TextView) findViewById(R.id.view1); 
      view1.setText("Current Data Rate per second= " + currentDataRate); 

      RXOld [0] = overallTraffic; 

      handler.postDelayed(this, 1000); 
     } 
    }, 1000); 
0

まずを拡張し、タイマーを使用することを検討して、最初にのTextViewを宣言します。私は、このコードは動作するはずだと思うが、私はそれをテストしていない:

 final TextView view1 = null; 
     view1 = (TextView) findViewById(R.id.view1); 
     final double[] oldT = new double[1]; 
     Timer timer1 = new Timer(); 
     TimerTask tt1 = new TimerTask() { 
      @Override 
      public void run() { 
       double overallTraffic = TrafficStats.getMobileRxBytes(); 
       double trafficRate = overallTraffic - oldT[0]; 
       oldT[0] = overallTraffic; 
       view1.setText("Current Data Rate per second= " + trafficRate); 
      } 
     }; 
     timer1.scheduleAtFixedRate(tt1,1000,1000); 

注意:あなたはTimerTaskをの実行()に新しい変数を使用する場合、変数は最終的に宣言しなければなりません。変数を1要素( 'int varName'ではなくint [] varName = new int [1])の配列に変更し、varNameの代わりにvarName [0]を使用することで、値を簡単に変更できます。

+0

おかげで、私はおそらく私のjavaを強化するものスキルは低いです。私はあなたがOldT [0]を使用したときに質問したいと思いますが、配列oldTはゼロ要素か、またはoldT配列の最初の要素を意味しました。私の質問には間違いがありますが、私がJavaで知っていることはそれほどではありませんでした。 – Ahmed

+0

私はハンドラの方法を使用していますが、それは機能していますが、なぜタイマーの方法をお勧めしましたか?再度、感謝します – Ahmed

関連する問題