我是Android新手,我正在构建一个带有5个按钮的应用程序,每个按钮播放一首不同的歌曲。我已经构建了运行良好的代码,但是活动需要2秒才能打开,我在LogCat中收到“跳过的104帧”警告。我的所有代码都在onCreate方法中,我认为这就是为什么需要这么长时间才能打开。如何创建新方法以及如何才能使用相同的功能?你能举个例子吗? 我的代码:
package com.example.testapplication;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
public class SoundActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_sound);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//SONGS
final MediaPlayer song1 = MediaPlayer.create(getApplicationContext(), R.drawable.song1);
final MediaPlayer song2 = MediaPlayer.create(getApplicationContext(), R.drawable.song2);
//BUTTONS
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
//CHECKBOX
final CheckBox loop = (CheckBox) findViewById(R.id.loop);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(loop.isChecked()) { //CHECKBOX
song1.setLooping(true);
}
if(song2.isPlaying()) {
song2.pause();
song1.start();
}
song1.start();
}
});
/* EDITED
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(loop.isChecked()) { //CHECKBOX
song2.setLooping(true);
}
if(song1.isPlaying()) {
song1.pause();
song2.start();
}
song2.start();
}
});
*/EDITED
}//onCreate
} //soundActivity class
如果按下song1按钮停止播放并播放song1,我需要播放song2。等等每个按钮,但如果指示则最多需要5个按钮。还有其他办法吗? 我从MainActivity开始我的SoundActivity,这是代码:
package com.example.testapplication;
import com.example.testapplication.R;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
TextView button01 = (TextView) findViewById(R.id.button01);
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
startActivity(new Intent(getApplicationContext(), SoundActivity.class));
}
});
}
}
编辑:已解决 - 我在onStart()方法中创建了一个新线程。代码工作得很好,活动大约需要140ms才能打开。谢谢您的回答。
答案 0 :(得分:0)
尝试使用不同的线程!您正在运行主UI线程上的所有内容。你应该看看:
http://developer.android.com/guide/components/processes-and-threads.html
答案 1 :(得分:0)
你必须使用Thread概念,这样所有这些东西都不会在主UI线程上运行,而是占用另一个线程来运行并保持你的UI而不会出现用户体验问题。
我建议您使用此示例代码示例,但在实现之前请确保阅读此内容:这尤其是为了克服您提到的问题或疑虑。这是时间,但绝对值得: Processes and Threads
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
//your code here;
}
}).start();
}
答案 2 :(得分:0)
作为示例和基本实现
public class SoundActivity extends Activity {
private MediaPlayer mediasong1;
private MediaPlayer mediasong2;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//SONGS
new MediaLoaderTask().execute();
//BUTTONS
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
//onClick
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(loop.isChecked()) { //CHECKBOX
song1.setLooping(true);
}
if(song2.isPlaying()) {
song2.pause();
song1.start();
}
song1.start();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(loop.isChecked()) { //CHECKBOX
song2.setLooping(true);
}
if(song1.isPlaying()) {
song1.pause();
song2.start();
}
song2.start();
}
});
}
private class MediaLoaderTask extends
android.os.AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
mediasong1 = MediaPlayer.create(getApplicationContext(),
R.drawable.song1);
mediasong2 = MediaPlayer.create(getApplicationContext(),
R.drawable.song2);
}
}
}