java - 跳过 69 帧!应用程序可能在其主线程上做了太多工作

标签 java android multithreading android-asynctask android-service

MainActivity 处于 Activity 状态时,我偶尔会收到此错误 The application may be doing too much work on its main thread ... 我正在使用线程, asyncTasks 和服务,但仍然出现错误..

这是 MainActivity 代码(里面有 NavigationDrawer):

/*
* Declerations are here
*/

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //animAlpha = AnimationUtils.loadAnimation(this, R.anim.anim_alpha);
    //animRotate = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);

    i_music = new Intent(this,PlayMusicService.class);
    i_music.putExtra("action", "com.example.neotavraham.PLAY");
    startService(i_music);
    music_flag = 1;

    //background_music = MediaPlayer.create(this, R.raw.yedid_nefesh);

    flipper = (ViewFlipper) findViewById(R.id.viewFlipper);
    flipper_thread = new Flipper(flipper);
    flipper_thread.execute();

    //background_music.start();

    Thread process_buttons = new Thread(){

        @Override
        public void run(){
            messages = (ImageButton) findViewById(R.id.messages_button);
            weekly_day_times = (ImageButton) findViewById(R.id.weekly_times_button);
            shabat_times = (ImageButton) findViewById(R.id.sat_times_button);
            events = (ImageButton) findViewById(R.id.events_button);
        }
    };

    Thread process_containers = new Thread(){

        @Override
        public void run(){
            mContainerView1 = (ViewGroup) findViewById(R.id.add_shabat_container);
            mContainerView2 = (ViewGroup) findViewById(R.id.add_weekly_container);
            mContainerView3 = (ViewGroup) findViewById(R.id.add_messages_container);
            mContainerView4 = (ViewGroup) findViewById(R.id.add_events_container);
            mContainerView5 = (ViewGroup) findViewById(R.id.add_friday_night_container);
            mContainerView6 = (ViewGroup) findViewById(R.id.add_friday_morning_container);
        }
    };

    Thread process_buttons_click_listener = new Thread(){

        @Override
        public void run(){
            messages.setOnClickListener(MainActivity.this);
            weekly_day_times.setOnClickListener(MainActivity.this);
            shabat_times.setOnClickListener(MainActivity.this);
            events.setOnClickListener(MainActivity.this);
        }
    };

    Thread process_nav_click_listener = new Thread(){

        @Override
        public void run(){
            findViewById(R.id.b_shabat_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_weekly_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_messages_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_events_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_friday_night_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_friday_morning_add).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_shabat_delete_all).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_friday_night_delete_all).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_friday_morning_delete_all).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_weekly_delete_all).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_messages_delete_all).setOnClickListener(MainActivity.this);
            findViewById(R.id.b_events_delete_all).setOnClickListener(MainActivity.this);

            findViewById(R.id.soundToggleButton).setOnClickListener(MainActivity.this);
        }
    };


    process_buttons.start();
    process_containers.start();
    process_buttons_click_listener.start();
    process_nav_click_listener.start();

    IntializeNavDrawer();

}

 private void IntializeNavDrawer() {

    mTitle = mDrawerTitle = getTitle();
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);


    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            null, R.string.drawer_open,
            R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to
            // onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getSupportActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to
            // onPrepareOptionsMenu()
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

/*
 *more irrelevant funcs here..
 */

另外这是背景音乐的服务:

public class PlayMusicService extends Service {
public static final String ACTION_PLAY = "com.example.neotavraham.PLAY";
MediaPlayer mMediaPlayer = null;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (intent.getStringExtra("action").equals(ACTION_PLAY)) {
        mMediaPlayer = MediaPlayer.create(this, R.raw.yedid_nefesh);
        mMediaPlayer.setLooping(true); // Set looping
        mMediaPlayer.start();
    }
    return flags;
}


@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    mMediaPlayer.stop();
    mMediaPlayer.release();
}
}

这是脚蹼类:

public class Flipper extends AsyncTask<String,String,String> {

private final ViewFlipper vFlipper;

public Flipper(ViewFlipper vFlipper){
    this.vFlipper = vFlipper;
}
@Override
protected String doInBackground(String... params) {
    startFlipper();
    return null;
}

private void startFlipper() {

    vFlipper.setFlipInterval(5000);
    //flipper.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
    //flipper.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));
    vFlipper.startFlipping();
}
}

我在我自己的手机上测试了这段代码,我的 galaxy s4,所以这不是模拟器慢的问题......

有什么想法我应该做更多吗?

最佳答案

Android Service运行在UI线程上,所以如果你想做太多的工作或者使用IntentService,你必须创建自己的线程它默认在工作线程上运行,但它一次只做一项工作,所以它只有一个线程。如果你想拥有多个线程,你必须使用普通服务并创建你自己的线程。阅读:Services

First of all, like an Activity, all work in a Service is done in a single thread by default—in fact, if you're running an activity and a service from the same application, they use the same thread (the "main thread") by default. Therefore, services need to process incoming intents quickly and never perform lengthy computations when responding to them. If any heavy work or blocking calls are expected, you must do those tasks asynchronously: either from another thread you implement yourself, or using the framework's many facilities for asynchronous processing.

Link

关于java - 跳过 69 帧!应用程序可能在其主线程上做了太多工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861700/

相关文章:

java - 如何更改 jsr-354 中 MonetaryAmount 除法的舍入

java - Junit 测试装置 - 初始化变量

java - 字符串数组的问题

java - 将复杂的 json 转换为简单的 Android POJO 文件的简单方法

java - 更改所选选项卡中的文本颜色

c++ - OpenGL 函数在多线程应用程序中失败

java - replaceAll 没有替换子字符串

java - 我能否将 main() 方法声明为同步的,以避免 .jar 文件(仅由 main() 组成)同时执行两次?

ruby - ruby 有真正的多线程吗?

android - 将项目粘贴到 recyclerview 顶部