1

MediaPlayer によって使用されるすべてのトラフィックを監視し、このデータ使用状況を TextView でユーザーに表示したいだけですが、これは最初にのみ機能しません。いくつかのバイトを返し、ハンドラー スレッドでこれらのバイトをインクリメントしませんが、ハンドラーのカウンターをインクリメントします。

[開始] をクリックすると、MediaPlayer が開始され、[データ使用量] の値も増加し、[停止] をクリックすると MediaPlayer が停止し、対応する NetworkUsage データの増分も停止する必要があります。

これはカウンターでは機能しますが、mStartRx = TrafficStats.getUidRxBytes(Process.myUid()); では機能しません。

助けてください Android 2.2 API レベル 8 で試したコード スニペットは次のとおりです。

public class AndroidHandlerRunnableActivity extends Activity
{

 private int cnt = 0;
 Button Start, Stop;
 TextView counter;
 long mStartRx;
 private Handler handler = new Handler();
 private MediaPlayer mediaPlayer;
 ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        counter = (TextView)findViewById(R.id.counter);
        Start = (Button)findViewById(R.id.Start);
        Start.setEnabled(true);
        Stop = (Button)findViewById(R.id.Stop);
        Stop.setEnabled(false);

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnPreparedListener(new MediaOnPreparedListener());   
        String networkURL = "http://currentstream1.publicradio.org/";   
            try
            {
                mediaPlayer.setDataSource(networkURL);
            } 
            catch (Exception e)
            {           
                e.printStackTrace();
            }       
        mediaPlayer.prepareAsync();
        mStartRx =  TrafficStats.getUidRxBytes(Process.myUid());
        progressDialog = ProgressDialog.show(this, "Playing audio", "Please wait...."); 


        Start.setOnClickListener(new Button.OnClickListener()
        {
               @Override
               public void onClick(View v) 
               {            
                   handler.post(timedTask);
                   mediaPlayer.start();
                   Start.setEnabled(false);
                   Stop.setEnabled(true);               
               }
        });

        Stop.setOnClickListener(new Button.OnClickListener()
        {
             public void onClick(View v) 
             {          
                    handler.removeCallbacks(timedTask);
                    mediaPlayer.stop();
                    Start.setEnabled(true);
                    Stop.setEnabled(false);
              }
        });
}

    private class MediaOnPreparedListener implements MediaPlayer.OnPreparedListener
    {
        @Override
        public void onPrepared(MediaPlayer mp) 
        {       
            if (progressDialog != null) 
            {               
                progressDialog.dismiss();
            }               
        }       
    }

    private Runnable timedTask = new Runnable()
    {
            @Override
          public void run() 
          {     
               cnt++;
               mStartRx =  TrafficStats.getUidRxBytes(Process.myUid());
               counter.setText(String.valueOf(cnt)+" Data "+mStartRx);
               handler.postDelayed(timedTask, 2000);
          }
     };


        @Override
        protected void onStop() 
        {
            super.onStop();
            if (mediaPlayer != null)
            {           
                mediaPlayer.stop();
                mediaPlayer.reset();
                mediaPlayer.release();
            }
        }
}

詳細については、ここに私のレイアウトファイルがあります

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/Start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start" />

    <Button
        android:id="@+id/Stop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Stop" />

    <TextView
        android:id="@+id/counter"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

そして、マニフェストファイルは次のとおりです

   <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exercise.AndroidHandlerRunnable"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AndroidHandlerRunnableActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
4

1 に答える 1

0

これがスレッドの問題に対する答えです。

さらに、すべての ui 要素をonResume()ではなく に配置する必要がありますonCreate()。UI スレッドが開始される前 (または UI スレッドが再開される前) に UI を操作しようとすると、問題が発生する可能性があります。

そして、呼び出しているコードを代わりにonStop()内側に配置する必要があります。アクティビティが終了したときに呼び出されることが保証されています。ではありません。たとえば、ユーザーがホームボタンを押したとき、または電話機が電話を受信したときに、このユースケースをテストできます。onPause()onPause()onStop()

アクティビティのライフサイクルに関する情報を次に示します。そのページをよく読む価値があります。

于 2012-06-15T08:59:00.350 に答える