Android在主线程中工作太多了

时间:2014-06-19 16:48:14

标签: android android-activity methods

我是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才能打开。谢谢您的回答。

3 个答案:

答案 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);
}

}
}