我只想监视MediaPlayer使用的所有流量并在TextView上向用户显示此数据用法,但这不能仅在第一次返回某些字节而不在Handler Thread上增加这些字节的同时增加一个计数器在处理程序上
单击“启动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>
答案 0 :(得分:0)
以下是您的线程问题的answer。
此外,您应该将所有ui内容放在onResume()
中,而不是onCreate()
中。在UI线程有机会开始之前(或者在UI线程有机会恢复之前)尝试操作UI可能会有问题。
您应该将onStop()
内部正在调用的代码放在onPause()
内。保证在退出活动时调用onPause()
。 onStop()
不是。例如,当用户按下主页按钮或手机接到电话时,您可以测试此用例。
以下是Activity Lifecycle的一些信息。值得给这个页面一个非常仔细的阅读。