【问题标题】:Android too much work in main threadAndroid在主线程中工作太多
【发布时间】:2014-06-19 16:48:14
【问题描述】:

我是 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 按钮时正在播放歌曲 2,我需要它来停止它们并只播放歌曲 1。依此类推每个按钮,但它最多需要 5 个 if 指令。还有其他方法吗? 我从 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() 方法中创建了一个新线程。代码工作得很好,活动大约需要 140 毫秒才能打开。谢谢您的回答。

【问题讨论】:

  • 您的代码中没有任何东西需要时间。 onClick 中的代码在活动创建时并未执行,因此我们不必查看它。一定有别的东西。
  • 好吧,这是我的全部代码。那么是什么减慢了应用程序的速度?打开活动最多需要 2-3 秒。
  • 认为这两条媒体播放器系列是罪魁祸首。带他们出去测试。
  • 我已经把它们拿出来了,但还是一样。你能告诉我线程示例代码需要去哪里(在 onCreate 方法或其他方法中)吗?谢谢!
  • 对我来说,您不必添加线程代码。你应该先弄清楚什么是耗时的?这是你的主要活动吗?如果没有,你如何启动它?您没有发布整个活动,因为除了媒体播放器之外没有什么可以花费时间的吗?例如,您在哪里设置布局?缺少 setContentView。

标签: android android-activity methods


【解决方案1】:

作为示例和基本实现

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

}
} 

【讨论】:

    【解决方案2】:

    尝试使用不同的线程!您正在主 UI 线程上运行所有内容。你应该看看:

    http://developer.android.com/guide/components/processes-and-threads.html

    【讨论】:

    【解决方案3】:

    您必须使用线程概念,这样所有这些东西就不会在主 UI 线程上运行,而是占用另一个线程来运行并保持您的 UI 不会出现用户体验问题。

    我建议您使用此示例代码示例,但在实施之前确保阅读以下内容:尤其是为了克服您提到的问题或顾虑。这是时间,但绝对值得: Processes and Threads

    public void onClick(View v) {
        new Thread(new Runnable() {
            public void run() {
               //your code here;
            }
        }).start();
    }
    

    【讨论】:

    • onClick 中的语句并不是使Activity 启动缓慢的语句。 @greenapps 对问题的评论是正确的。
    • 是的...我再次阅读了您的问题和代码...为什么您不能发布您的整个代码以便我们可以建议您更好地处理这种情况?
    • 我应该在哪里实现示例代码,在 onCreate 方法中?还是我必须创建一个新的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多