我刚刚在业余时间开始进行Android开发(已知Java十年),我有这个应用程序有一个我似乎无法弄清楚的问题。
我的手机在我的手机上非常慢(LG G3),但在模拟器中,它运行时很平滑。对于长时间运行的代码,我使用异步和off-ui线程的正确用法进行代码设置。
我甚至禁用了我的一个设置开关,什么都不做,而且我的手机上移动滑块的速度仍然很慢。
我认为这可能不是代码问题,但作为一个新手,我不做任何假设。
到目前为止,这是我的故障排除列表。
无论如何,这里的活动会引发许多编舞警告。 (删除了导入和变量声明以保存字符)
private void save() {
Log.v(TAG, "Invoke save()");
SharedPreferences sharedPreferences = getSharedPreferences(getString(R.string.SettingsLibraryName), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(getString(R.string.showButtons), showButtons);
editor.putBoolean(getString(R.string.lightBackground), lightBackground);
editor.putBoolean(getString(R.string.enableNotifications), enableNotifications);
editor.putBoolean(getString(R.string.debugMode), debugMode);
editor.putBoolean("enableSchedule", enableSchedule);
editor.putInt(getString(R.string.foregroundRefreshInterval), foregroundRefreshInterval);
Log.d(TAG, "fri=" + String.valueOf(foregroundRefreshInterval));
Log.d(TAG, "bri=" + String.valueOf(backgroundRefreshInterval));
editor.putInt(getString(R.string.backgroundRefreshInterval), backgroundRefreshInterval);
editor.putInt(getString(R.string.fri_seekPosition), fri_seekBarPosition);
editor.putInt(getString(R.string.bri_seekPosition), bri_seekBarPosition);
editor.putInt("onImageIndex", selectedOnImage);
editor.putInt("offImageIndex", selectedOffImage);
editor.putInt("statusImageCounter", selectedImageSet);
editor.putInt("toMonth", toMonth);
editor.putInt("fromMonth", fromMonth);
editor.apply();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "Invoke onCreate()");
//Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar2);
//setSupportActionBar(toolbar);
loadSettings();
Log.v(TAG, "showButtons: " + String.valueOf(showButtons) + " lightbackground: " + String.valueOf(lightBackground) + " notifications: " + String.valueOf(enableNotifications));
//showButtons = ((MainActivity)ctx).showButtons;
//lightBackground = ((MainActivity)ctx).lightBackground;
setContentView(R.layout.activity_settings);
//layoutId = R.layout.activity_settings;
initializeObjects();
configureObjects();
startupObjectListeners();
setDisplayColors();
//Log.v(TAG, String.valueOf(layoutId));
Log.v(TAG, String.valueOf(showButtons));
}
private void configureObjects() {
Log.v(TAG, "Invoke configureObjects()");
offImagePreview.setImageResource(selectedOffImage);
lightBackgroundSwitch.setChecked(lightBackground);
enableNotificationsSwitch.setChecked(enableNotifications);
showButtonsSwitch.setChecked(!showButtons);
onImagePreview.setImageResource(selectedOnImage);
debugSwitch.setChecked(debugMode);
fri_seekBar.setProgress(fri_seekBarPosition);
bri_seekBar.setProgress(bri_seekBarPosition);
toMonth_seekBar.setProgress(toMonth - 1);
fromMonth_seekBar.setProgress(fromMonth - 1);
showMonth_Text(toMonth, toMonthSelectTitle, false);
showMonth_Text(fromMonth, fromMonthSelectTitle, true);
showFRI_Text(fri_seekBarPosition);
showBRI_Text(bri_seekBarPosition);
try {
String versionString = "Version: " + getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Log.d(TAG, getPackageManager().getPackageInfo(getPackageName(), 0).packageName);
Log.d(TAG, getPackageManager().getPackageInfo(getPackageName(), 0).versionName);
versionNumberTextBox.setText(versionString);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
private void loadSettings() {
Log.v(TAG, "Invoke loadSettings()");
sharedPreferences = getSharedPreferences(getString(R.string.SettingsLibraryName), Context.MODE_PRIVATE);
showButtons = sharedPreferences.getBoolean(getString(R.string.showButtons), true);
lightBackground = sharedPreferences.getBoolean(getString(R.string.lightBackground), false);
enableNotifications = sharedPreferences.getBoolean(getString(R.string.enableNotifications), true);
debugMode = sharedPreferences.getBoolean(getString(R.string.debugMode), false);
enableSchedule = sharedPreferences.getBoolean("enableSchedule", true);
selectedOnImage = sharedPreferences.getInt("onImageIndex", R.drawable.power_on_image_1);
selectedOffImage = sharedPreferences.getInt("offImageIndex", R.drawable.power_off_image_1);
selectedImageSet = sharedPreferences.getInt("statusImageCounter", 1);
toMonth = sharedPreferences.getInt("toMonth", 1);
fromMonth = sharedPreferences.getInt("fromMonth", 1);
foregroundRefreshInterval = sharedPreferences.getInt(getString(R.string.foregroundRefreshInterval), 0);
backgroundRefreshInterval = sharedPreferences.getInt(getString(R.string.backgroundRefreshInterval), 0);
fri_seekBarPosition = sharedPreferences.getInt(getString(R.string.fri_seekPosition), 0);
bri_seekBarPosition = sharedPreferences.getInt(getString(R.string.bri_seekPosition), 0);
}
private void initializeObjects() {
Log.v(TAG, "Invoke initializeObjects()");
showButtonsSwitch = (Switch) findViewById(R.id.showButtonsSwitch);
fromMonth_seekBar = (SeekBar) findViewById(R.id.fromMonth_seekBar);
toMonth_seekBar = (SeekBar) findViewById(R.id.toMonth_seekBar);
fri_seekBarText = (TextView) findViewById(R.id.fri_Text);
bri_seekBarText = (TextView) findViewById(R.id.bri_Text);
fri_seekBar = (SeekBar) findViewById(R.id.fri);
bri_seekBar = (SeekBar) findViewById(R.id.bri);
lightBackgroundSwitch = (Switch) findViewById(R.id.lightBackgroundSwitch);
enableNotificationsSwitch = (Switch) findViewById(R.id.enableNotificationsSwitch);
enableScheduleSwitch = (Switch) findViewById(R.id.enableSchedule);
debugSwitch = (Switch) findViewById(R.id.debugMode);
displaySettingsTitle = (TextView) findViewById(R.id.displaySettingsTitle);
imageSetTitle = (TextView) findViewById(R.id.imageSetTitle);
rightArrow = (TextView) findViewById(R.id.rightArrow);
leftArrow = (TextView) findViewById(R.id.leftArrow);
systemSettingsTitle = (TextView) findViewById(R.id.systemSettingsTitle);
versionNumberTextBox = (TextView) findViewById(R.id.versionNumber);
fromMonthSelectTitle = (TextView) findViewById(R.id.fromMonthSelectionTitle);
summerMonthsTitle = (TextView) findViewById(R.id.summerMonthsTitle);
summerHoursTitle = (TextView) findViewById(R.id.summerHoursTitle);
toMonthSelectTitle = (TextView) findViewById(R.id.toMonthSelectionTitle);
onImagePreview = (ImageView) findViewById(R.id.onImagePreview);
offImagePreview = (ImageView) findViewById(R.id.offImagePreview);
previewContainer = (LinearLayout) findViewById(R.id.previewContainer);
}
private void startupObjectListeners() {
Log.v(TAG, "Invoke startupObjectListeners()");
fri_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
showFRI_Text(progress);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
bri_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
showBRI_Text(progress);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
fromMonth_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
fromMonth = progress + 1;
showMonth_Text(progress + 1, fromMonthSelectTitle, true);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
toMonth_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
toMonth = progress + 1;
showMonth_Text(progress + 1, toMonthSelectTitle, false);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
previewContainer.setOnTouchListener(new OnSwipeTouchListener(getApplicationContext()) {
@Override
public void onSwipeRight() {
previousImage();
}
public void onSwipeLeft() {
nextImage();
}
});
}
private void showMonth_Text(int month, TextView target, boolean from) {
Log.v(TAG, "Invoke showMonth_Text()");
if (from) {
switch (month) {
case 1:
target.setText("From: January");
break;
case 2:
target.setText("From: February");
break;
case 3:
target.setText("From: March");
break;
case 4:
target.setText("From: April");
break;
case 5:
target.setText("From: May");
break;
case 6:
target.setText("From: June");
break;
case 7:
target.setText("From: July");
break;
case 8:
target.setText("From: August");
break;
case 9:
target.setText("From: September");
break;
case 10:
target.setText("From: October");
break;
case 11:
target.setText("From: November");
break;
case 12:
target.setText("From: Decemeber");
break;
}
} else {
switch (month) {
case 1:
target.setText("To: January");
break;
case 2:
target.setText("To: February");
break;
case 3:
target.setText("To: March");
break;
case 4:
target.setText("To: April");
break;
case 5:
target.setText("To: May");
break;
case 6:
target.setText("To: June");
break;
case 7:
target.setText("To: July");
break;
case 8:
target.setText("To: August");
break;
case 9:
target.setText("To: September");
break;
case 10:
target.setText("To: October");
break;
case 11:
target.setText("To: November");
break;
case 12:
target.setText("To: Decemeber");
break;
}
}
}
public void toggleSchedule(View v) {
Log.v(TAG, "Invoke toggleSchedule()");
enableSchedule = !enableSchedule;
if (fromMonthSelectTitle.getVisibility() == View.VISIBLE) {
fromMonthSelectTitle.setVisibility(View.GONE);
} else {
fromMonthSelectTitle.setVisibility(View.VISIBLE);
}
if (toMonthSelectTitle.getVisibility() == View.VISIBLE) {
toMonthSelectTitle.setVisibility(View.GONE);
} else {
toMonthSelectTitle.setVisibility(View.VISIBLE);
}
if (fromMonth_seekBar.getVisibility() == View.VISIBLE) {
fromMonth_seekBar.setVisibility(View.GONE);
} else {
fromMonth_seekBar.setVisibility(View.VISIBLE);
}
if (summerMonthsTitle.getVisibility() == View.VISIBLE) {
summerMonthsTitle.setVisibility(View.GONE);
} else {
summerMonthsTitle.setVisibility(View.VISIBLE);
}
if (summerHoursTitle.getVisibility() == View.VISIBLE) {
summerHoursTitle.setVisibility(View.GONE);
} else {
summerHoursTitle.setVisibility(View.VISIBLE);
}
}
private void showFRI_Text(int progress) {
Log.v(TAG, "Invoke showFRI_Text()");
//float weightedProgress=((300000.0f)/(-1*(progress-3681.63467f)))-81.486f;
fri_seekBarPosition = progress;
//progress = ((int) weightedProgress);
progress = progress / 60;
int minutes = 0;
int seconds = progress;
int hours = 0;
if (progress > 59) {
minutes = progress / 60;
if (minutes > 59) {
hours = minutes / 60;
minutes = minutes % 60;
}
seconds = progress % 60;
}
String message = getString(R.string.fri_text);
if (hours != 0) {
message = message + String.valueOf(hours) + " Hours " + String.valueOf(minutes) + " Minutes";
} else if (minutes != 0) {
message = message + String.valueOf(minutes) + " Minutes";
} else if (seconds != 0) {
message = message + String.valueOf(seconds) + " Seconds";
} else {
message = message + " Never";
}
foregroundRefreshInterval = progress;
fri_seekBarText.setText(message);
}
private int getStatusImageCount(String searchString) {
Log.v(TAG, "Invoke getStatusImageCount()");
int count = 0;
Field[] fields = R.drawable.class.getFields();
List < Integer > drawables = new ArrayList < Integer > ();
for (Field field: fields) {
// Take only those with name starting with "fr"
if (field.getName().startsWith(searchString)) {
count++;
}
}
return count;
}
private void showBRI_Text(int progress) {
Log.v(TAG, "Invoke showBRI_Text()");
float weightedProgress = ((50000000.0 f) / (-1 * (progress - 23710.0 f))) - 2108.815 f;
// Log.d(TAG,"weightedProgress="+String.valueOf(weightedProgress));
bri_seekBarPosition = progress;
progress = ((int) weightedProgress);
int minutes = 0;
int seconds = progress;
int hours = 0;
if (progress > 59) {
minutes = progress / 60;
if (minutes > 59) {
hours = minutes / 60;
minutes = minutes % 60;
}
seconds = progress % 60;
}
String message = getString(R.string.bri_text);
if (hours != 0) {
message = message + String.valueOf(hours) + " Hours " + String.valueOf(minutes) + " Minutes";
} else if (minutes != 0) {
message = message + String.valueOf(minutes) + " Minutes";
} else if (seconds != 0) {
message = message + String.valueOf(seconds) + " Seconds";
} else {
message = message + " Never";
}
backgroundRefreshInterval = progress;
bri_seekBarText.setText(message);
}
public void playButtonTickSound() {
SoundInterface.SoundRunnable sound = new SoundInterface.SoundRunnable(this, "tick");
sound.run();
}
public void toggleShowButtons(View v) {
//playButtonTickSound();
showButtons = !showButtons;
//Log.v(TAG, showButtons.toString());
}
public void toggleDebugMode(View v) {
//playButtonTickSound();
debugMode = !debugMode;
//Log.v(TAG, showButtons.toString());
}
public void toggleNotifications(View v) {
//playButtonTickSound();
enableNotifications = !enableNotifications;
//Log.v(TAG, enableNotifications.toString());
}
public void toggleBackground(View v) {
//playButtonTickSound();
//lightBackground = !lightBackground;
//setDisplayColors();
//Log.v(TAG, showButtons.toString());
}
public void nextImage(View v) {
nextImage();
}
public void nextImage() {
Log.v(TAG, "Next Image");
int totalImages = getStatusImageCount("power_on_");
Log.v(TAG, "Total Images = " + String.valueOf(totalImages));
Log.v(TAG, "counter = " + String.valueOf(selectedImageSet));
if (selectedImageSet < totalImages) {
selectedImageSet++;
} else {
selectedImageSet = 1;
}
String onImageName = "power_on_image_" + String.valueOf(selectedImageSet);
String offImageName = "power_off_image_" + String.valueOf(selectedImageSet);
selectedOnImage = getResources().getIdentifier(onImageName, "drawable", getPackageName());
selectedOffImage = getResources().getIdentifier(offImageName, "drawable", getPackageName());
Log.d(TAG, "selectedOnImage ID=" + String.valueOf(selectedOnImage));
Log.d(TAG, "selectedOffImage ID=" + String.valueOf(selectedOffImage));
onImagePreview.setImageResource(selectedOnImage);
offImagePreview.setImageResource(selectedOffImage);
}
public void previousImage(View v) {
previousImage();
}
public void previousImage() {
Log.v(TAG, "Next Image");
int totalImages = getStatusImageCount("power_on_");
Log.v(TAG, "Total Images = " + String.valueOf(totalImages));
Log.v(TAG, "counter = " + String.valueOf(selectedImageSet));
if (selectedImageSet > 1) {
selectedImageSet--;
} else {
selectedImageSet = totalImages;
}
String onImageName = "power_on_image_" + String.valueOf(selectedImageSet);
String offImageName = "power_off_image_" + String.valueOf(selectedImageSet);
selectedOnImage = getResources().getIdentifier(onImageName, "drawable", getPackageName());
selectedOffImage = getResources().getIdentifier(offImageName, "drawable", getPackageName());
Log.d(TAG, "selectedOnImage ID=" + String.valueOf(selectedOnImage));
Log.d(TAG, "selectedOffImage ID=" + String.valueOf(selectedOffImage));
onImagePreview.setImageResource(selectedOnImage);
offImagePreview.setImageResource(selectedOffImage);
}
private void setDisplayColors() {
/*
if (lightBackground) {
findViewById(R.id.settings_container).setBackgroundColor(Color.parseColor("#ffffff"));
showButtonsSwitch.setTextColor(Color.parseColor("#000000"));
lightBackgroundSwitch.setTextColor(Color.parseColor("#000000"));
enableNotificationsSwitch.setTextColor(Color.parseColor("#000000"));
versionNumberTextBox.setTextColor(Color.parseColor("#000000"));
displaySettingsTitle.setTextColor(Color.parseColor("#000000"));
systemSettingsTitle.setTextColor(Color.parseColor("#000000"));
debugSwitch.setTextColor(Color.parseColor("#000000"));
fri_seekBarText.setTextColor(Color.parseColor("#000000"));
bri_seekBarText.setTextColor(Color.parseColor("#000000"));
leftArrow.setTextColor(Color.parseColor("#000000"));
rightArrow.setTextColor(Color.parseColor("#000000"));
imageSetTitle.setTextColor(Color.parseColor("#000000"));
fromMonthSelectTitle.setTextColor(Color.parseColor("#000000"));
toMonthSelectTitle.setTextColor(Color.parseColor("#000000"));
enableScheduleSwitch.setTextColor(Color.parseColor("#000000"));
} else {
findViewById(R.id.settings_container).setBackgroundColor(Color.parseColor("#000000"));
showButtonsSwitch.setTextColor(Color.parseColor("#ffffff"));
lightBackgroundSwitch.setTextColor(Color.parseColor("#ffffff"));
enableNotificationsSwitch.setTextColor(Color.parseColor("#ffffff"));
displaySettingsTitle.setTextColor(Color.parseColor("#ffffff"));
systemSettingsTitle.setTextColor(Color.parseColor("#ffffff"));
debugSwitch.setTextColor(Color.parseColor("#ffffff"));
fri_seekBarText.setTextColor(Color.parseColor("#ffffff"));
bri_seekBarText.setTextColor(Color.parseColor("#ffffff"));
rightArrow.setTextColor(Color.parseColor("#ffffff"));
leftArrow.setTextColor(Color.parseColor("#ffffff"));
imageSetTitle.setTextColor(Color.parseColor("#ffffff"));
fromMonthSelectTitle.setTextColor(Color.parseColor("#ffffff"));
toMonthSelectTitle.setTextColor(Color.parseColor("#ffffff"));
enableScheduleSwitch.setTextColor(Color.parseColor("#ffffff"));
versionNumberTextBox.setTextColor(Color.parseColor("#ffffff"));
}
*/
}
public void exitSettings(View v) {
exitSettings();
}
public void exitSettings() {
save();
//playButtonTickSound();
Log.v(TAG, "showButtons: " + String.valueOf(showButtons) + " lightbackground: " + String.valueOf(lightBackground) + " notifications: " + String.valueOf(enableNotifications));
Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
//myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myIntent.putExtra("tk.jacobsen.chris.vapecontrol.MainActivity", true);
startActivity(myIntent);
//super.setContentView(R.layout.activity_main);
//layoutId = R.layout.activity_main;
// Log.v(TAG, String.valueOf(layoutId));
}
@Override
public void onBackPressed() {
exitSettings();
// your code.
}
}
和logcat。我在日志开始时进入我的设置活动,并在Choreographer警告开始时点击我的测试开关。
05-02 18:00:14.824 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke onCreate()
05-02 18:00:14.824 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke loadSettings()
05-02 18:00:14.824 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: showButtons: false lightbackground: true notifications: true
05-02 18:00:14.878 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke initializeObjects()
05-02 18:00:14.878 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke configureObjects()
05-02 18:00:14.880 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke showMonth_Text()
05-02 18:00:14.880 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke showMonth_Text()
05-02 18:00:14.880 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke showFRI_Text()
05-02 18:00:14.880 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke showBRI_Text()
05-02 18:00:14.881 31627-31627/tk.jacobsen.chris.vapecontrol D/SettingsActivity: tk.jacobsen.chris.vapecontrol
05-02 18:00:14.882 31627-31627/tk.jacobsen.chris.vapecontrol D/SettingsActivity: 1.45
05-02 18:00:14.882 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: Invoke startupObjectListeners()
05-02 18:00:14.882 31627-31627/tk.jacobsen.chris.vapecontrol V/SettingsActivity: false
05-02 18:00:14.950 31627-32222/tk.jacobsen.chris.vapecontrol D/MainActivity: 2017/05/02 15:32:27
05-02 18:00:14.952 31627-32222/tk.jacobsen.chris.vapecontrol V/MainActivity: It is not summer the current month is 4
05-02 18:00:14.953 31627-32222/tk.jacobsen.chris.vapecontrol V/MainActivity: Completed background schedueld task
05-02 18:00:16.175 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 73 frames! The application may be doing too much work on its main thread.
05-02 18:00:17.283 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 66 frames! The application may be doing too much work on its main thread.
05-02 18:00:18.571 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 64 frames! The application may be doing too much work on its main thread.
05-02 18:00:19.723 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 68 frames! The application may be doing too much work on its main thread.
05-02 18:00:20.559 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 49 frames! The application may be doing too much work on its main thread.
05-02 18:00:21.564 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 59 frames! The application may be doing too much work on its main thread.
05-02 18:00:22.338 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 46 frames! The application may be doing too much work on its main thread.
05-02 18:00:23.281 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 55 frames! The application may be doing too much work on its main thread.
05-02 18:00:24.031 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 44 frames! The application may be doing too much work on its main thread.
05-02 18:00:25.134 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 66 frames! The application may be doing too much work on its main thread.
05-02 18:00:31.340 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 45 frames! The application may be doing too much work on its main thread.
05-02 18:00:32.389 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 62 frames! The application may be doing too much work on its main thread.
05-02 18:00:33.211 31627-31627/tk.jacobsen.chris.vapecontrol I/Choreographer: Skipped 48 frames! The application may be doing too much work on its main thread.