gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:19:04 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com