- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个使用一些动画逻辑的时钟应用程序。在 onCreate() 中,我的应用程序 Activity 分配了一个扩展 Thread 的类的实例,该类在 run() 中循环执行逻辑处理。我正在使用线程化的 SurfaceView(按照 LunarLander 示例,但使用上下文修复开关)来管理 Canvas 上的绘图。
只要有焦点,应用程序就可以正常运行。我在 onPause() 中挂起 () 逻辑线程,在 onResume() 中恢复 () 并在 onDestroy() 中停止 () 以确保当用户切换离开时它不会消耗资源。
此应用在模拟器上运行没有问题。我可以根据需要随时切换和返回该应用程序,而不会产生不良影响。
但是当在物理硬件上运行 Android 时,如果你从我的应用程序切换回来几次,整个系统将变得无响应。最终手机会忽略所有输入,包括顶部的 sleep /电源开关,并且必须通过取出电池重新启动。
作为测试,我禁用了逻辑线程的创建,但保留渲染代码并运行少量动画逻辑,它解决了问题,所以我觉得这是我正在做的事情对系统来说必须非常糟糕的逻辑处理线程。我是新手,所以我可能犯了一个菜鸟错误。
感谢任何帮助或指向有关我如何分析此问题的信息的指示。
编辑:列出 Activity 源。我删除了少量与线程无关的内容,希望能澄清列表。 (对不起,如果我弄乱了格式,这里是新的)
public class EyesClockActivity extends Activity
implements SensorEventListener
{
// ---- options (shared preferences) ----
// snip, couple of booleans
// --------------------------------------------------------
private void LoadPreferences()
{
} // end EyesClockActivity.LoadPreferences()
// --------------------------------------------------------
private void SavePreferences()
{
} // end EyesClockActivity.SavePreferences()
// ========================================================
private class EyesClockActivityThread extends Thread
{
private long m_LastUpdateMilliSeconds;
private boolean m_running = false;
public void SetRunning( final boolean running )
{
// if restarting, don't want huge time leap
if ( ( m_running == false )
&& ( running == true ) )
{
m_LastUpdateMilliSeconds = System.currentTimeMillis();
}
m_running = running;
}
// ----------------------------------------------
public EyesClockActivityThread()
{
m_digits = new EyeDigit[4];
int index;
for ( index = 0; index < m_digits.length; ++index )
{
m_digits[ index ] = new EyeDigit();
}
m_digits[0].SetCurrentDigit( 0 );
m_digits[1].SetCurrentDigit( 0 );
m_digits[2].SetCurrentDigit( 0 );
m_digits[3].SetCurrentDigit( 0 );
m_TestDigit.SetCurrentDigit( m_currentDigit );
m_LastUpdateMilliSeconds = System.currentTimeMillis();
m_lastDigitChangeMilliseconds = System.currentTimeMillis();
int minute = Calendar.getInstance().get(Calendar.MINUTE);
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY );
SetTime( hour, minute );
} // end EyesClockActivityThread constructor
// --------------------------------------------------------------------
// sets digits to display specified hour,minute
private void SetTime( final int hour, final int minute )
{
} // end method EyesClockActivityThread.SetTime()
// ----------------------------------------------
public void run()
{
while (true)
{
if ( m_running )
{
final float updatesPerSecond = 30.0f;
final long milliSecondsBetweenUpdates = (long)(( 1.0f / updatesPerSecond ) * 1000.0f);
long currentTimeMilliSeconds = System.currentTimeMillis();
// TODO sleep here instead of checking constantly
if ( (currentTimeMilliSeconds - m_LastUpdateMilliSeconds) > milliSecondsBetweenUpdates )
{
int minute = Calendar.getInstance().get(Calendar.MINUTE);
// don't bother setting time unless minute has changed
if ( (minute % 10) != m_digits[0].GetCurrentDigit() )
{
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY );
SetTime( hour, minute );
}
float secondsSinceLastUpdate = (float)((currentTimeMilliSeconds - m_LastUpdateMilliSeconds) / 1000.0);
for ( EyeDigit digit : m_digits )
{
digit.Update( secondsSinceLastUpdate );
}
// global update routines
m_LastUpdateMilliSeconds = System.currentTimeMillis();
}
} // end if m_running
}
} // end EyesClockActivityThread.run()
} // end class EyesClockActivityThread
private EyesClockActivityThread m_EyesActivityThread;
private EyesClockSurfaceView m_EyesSurfaceView;
// ---- sensor interface ----
private SensorManager m_SensorManager;
private Sensor m_Accelerometer;
// -------------------------------------------------------------------------------
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
EyeDigit.InitDigitDescriptors();
m_EyesActivityThread = new EyesClockActivityThread();
// No Title bar
requestWindowFeature(Window.FEATURE_NO_TITLE);
m_EyesActivityThread.SetRunning(true);
m_EyesActivityThread.start();
LoadPreferences();
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_EyesSurfaceView = (EyesClockSurfaceView)findViewById(R.id.eyesclocksurfaceview);
Configuration config = getResources().getConfiguration();
m_EyesSurfaceView.SetOrientation( config.orientation );
m_EyesSurfaceView.SetDigits( m_EyesActivityThread.GetDigits() );
m_SensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
m_Accelerometer = m_SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
} // end method EyesClockActivity.onCreate()
// ----------------------------------------------
protected void onPause()
{
super.onPause();
// pause activity thread
m_EyesActivityThread.SetRunning(false);
m_EyesActivityThread.suspend();
// quit sensor listening
m_SensorManager.unregisterListener(this);
} // end method EyesClockActivity.onPause()
// ----------------------------------------------------
protected void onResume()
{
super.onResume();
// resume activity thread
m_EyesActivityThread.SetRunning(true);
m_EyesActivityThread.resume();
m_SensorManager.registerListener(this, m_Accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
} // end method EyesClockActivity.onResume()
// ------------------------------------------------------
protected void onDestroy()
{
super.onDestroy();
m_EyesActivityThread.SetRunning(false);
m_EyesActivityThread.stop();
m_SensorManager.unregisterListener(this);
// quit sensor listening
m_SensorManager.unregisterListener(this);
} // end method EyesClockActivity.onDestroy()
// -------------------------------------------------------
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
// ----------------------------------------------------
public void onSensorChanged(SensorEvent event)
{
if ( ( event.values[0] > 15.0f )
|| ( event.values[1] > 15.0f )
|| ( event.values[2] > 15.0f ) )
{
m_EyesActivityThread.StartGoogleyEvent();
}
} // end method EyesClockActivity.onSensorChanged()
// ---- options menu ----
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// add cursor blink toggle item
menu.add( Menu.NONE, R.id.toggle_blink, Menu.NONE, R.string.string_blink_cursor);
if ( GetTwelveHourDisplay())
{
menu.add( Menu.NONE, R.id.toggle_twelve_hour_display, Menu.NONE, R.string.string_24_hour_display );
}
else
{
menu.add( Menu.NONE, R.id.toggle_twelve_hour_display, Menu.NONE, R.string.string_12_hour_display );
}
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
super.onPrepareOptionsMenu(menu);
MenuItem displayItem = menu.getItem(1);
if ( displayItem != null )
{
if ( GetTwelveHourDisplay())
{
displayItem.setTitle(R.string.string_24_hour_display);
}
else
{
displayItem.setTitle(R.string.string_12_hour_display);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle item selection
switch (item.getItemId())
{
case R.id.toggle_twelve_hour_display:
ToggleTwelveHourDisplay();
int minute = Calendar.getInstance().get(Calendar.MINUTE);
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY );
m_EyesActivityThread.SetTime( hour, minute );
SavePreferences();
return true;
case R.id.toggle_blink :
ToggleBlinkCursor();
SavePreferences();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
最佳答案
在 java 线程中,stop()
、resume()
和 suspend()
已弃用,不应再使用。线程的自然顺序是让它在 onPause()
中死亡,并在 onResume()
关于安卓 : system becomes unresponsive after switching away from my app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413991/
大家好,我正在执行一个不同类型的可用移动网站元素,其中包括在移动设备上显示的响应式网站和标准桌面网站。现在我已经制作了基于响应式骨架的网站,我需要制作一个“无响应”的 HTML 网站。 与其经历制作
嘿,每当我运行我的脚本时,它似乎都会收到此警告消息。 当我在脚本中调用 jquery 函数时会发生这种情况。我已包含下面的脚本并在我调用该函数的位置放置 - 警告:无响应脚本 - 注释。我真的不知道为
我正在使用 C# .Net Windows 应用程序。在这里,我使用了来自 bitbucket 的 xulrunner 22.0 + Geckofx 22.0。 我已经使用 Geckofx 浏览器在我
这是我在这里发表的第一篇文章,我在表达问题时遇到了问题,所以请耐心等待,因为我已经在这个问题上研究了几个小时。 我和我的 friend 想到了一个有趣的小函数,它应该在一定数量的试验中使用随机数函数来
这个问题已经有答案了: Asynchronous and synchronous (2 个回答) 已关闭10 年前。 我正在使用像这样的 jQuery ajax 代码: $.each(url_id,
我有一个 HTML 文档,它是响应式的。 我想让它没有反应。我怎样才能以最有效、最快的方式做到这一点? 我已经尝试将 min-width 赋予 html 和 body;然而,一些对象仍然响应窗口大小。
我有一个 MKMapView,上面有 2 个按钮:放大和缩小。 我注意到,当我使用它们时,在动画完成之前我无法再捏合 map 进行缩放。 我的按钮连接到 setRegion 的范围比现在更小或更大。
请原谅我的无知,我对使用 XULRunner 还比较陌生。 我正在尝试调试 XULRunner 应用程序的问题,但遇到了困难。我们正在使用该应用程序加载某些网站并检索布局信息。抓取完成后,我们关闭页面
在 D3 中使用闪烁功能时,一段时间后我收到一条错误消息 .transition() .duration(250)
我为我的应用程序设计了一个 GUI,单击按钮后,我连接了一个自定义函数,其中我调用 bash 命令来同时运行 2 个 Python 脚本。这两个脚本都是 Qt 应用程序。我有一个名为“开始”的按钮来运
我为 Movember 创建了一个小的 javascript 网页,让用户可以将我的 mustache “剃”成 mustache ,或者完全剃掉。 我通过用 div 网格覆盖剃光图片来完成此操作,其
我正在开发一个从噪声算法生成模式的 JS 项目。我正在生成多个 Octave 音阶的噪音以获得我想要的结果,最终大约有 7,000,000 个值。正如您想象的那样,我收到了一个无响应的脚本错误。 有没
我有一个通过 Derelict 3 访问的 SDL2 窗口化窗口。 它应该是黑白频闪的(不是因为我讨厌癫痫患者),而且它成功地做到了这一点。然而,在一段时间后,Ubuntu 13.10 将窗口标记为“
我有一个可以转换多种文件格式的小应用程序,它有一个主窗口窗体,其中包含几个文本框、按钮等。我有另一个“文档”类来处理所有实际的转换工作,我的窗体基本上是迭代的通过所有文件,并调用适当的 Documen
我有一个 javascript 长执行过程(以及拥有它的原因)。如何避免 在 javascript 客户端计算机上出现消息?我读到一些关于--disable-hang-monitor,但它是一个命令行
我开发了一个 PHP 系统,该系统使用 Javascript 和 ExtJS 库,该库提供 Javascript 中的图形组件。所以我有一个网格,每 3 分钟通过 AJAX 调用刷新一次,该调用会重新
我正在编写一个使用一些动画逻辑的时钟应用程序。在 onCreate() 中,我的应用程序 Activity 分配了一个扩展 Thread 的类的实例,该类在 run() 中循环执行逻辑处理。我正在使用
我正在编写一个 javascript 程序,其中包含一个运行时间非常长的 foreach 循环,如下所示: for (property in object) { difficultTask()
我有文章和图片部分:
我使用 GCD 在 UIWebView 中运行 javascript,当它是正常的 javascipt 时,一切似乎都找到了,但是当涉及到“警报”时,弹出模态视图使我的用户界面变得无响应。 这是我在
我是一名优秀的程序员,十分优秀!