1

我只是想监视MediaPlayer使用的所有流量,并在TextView上向用户显示此数据使用情况,但这不会仅在第一次它返回一些字节而不增加这些字节在处理程序线程上虽然它增加了处理程序上的计数器如何监视媒体播放器收到的NetworkTraffic

点击Start 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> 

而且manifiest文件是为如下

<?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> 

回答

0

这是您的answer线程问题。

此外,你应该把你所有的用户界面的东西在onResume(),而不是在onCreate()。在UI线程有机会开始之前(或在UI线程有机会恢复之前)尝试操作UI可能会有问题。

而你应该把代码,你在onStop()里面调用。保证在退出活动时调用onPause()onStop()不是。例如,当用户按下home键时,或者手机接到电话时,您可以测试此用例。

这是关于Activity Lifecycle的一些信息。值得给这个页面一个非常仔细的阅读。