(我在stackoverflow上看到一个类似的问题,但答案并不是真正的答案,问题的上下文也有所不同.)
"java.lang.RuntimeException:执行暂停未恢复的活动"
我开发了一个游戏应用程序(使用普通视图和GLSurfaceView).如果我打开和关闭我的手机显示非常快,我可能会导致此异常有时(由ActivityThread抛出),但我的应用程序异常后正常运行.我的应用程序是横向应用程序,也可以在清单中正确设置(包括方向和配置更改).
这个可以吗?
这是ActivityThread在我的应用程序的应用程序名称下抛出的RuntimeException,但它不会终止我的应用程序.
我正在使用Google Cardboard(它的HeadTracker
类)来检测AR应用程序中有关设备旋转的某些事情.它工作得很好.
但是,在某些设备上,它不起作用(没有任何反应).我认为这是因为他们没有必要的传感器.我的问题:
1)我想在运行时检测当前设备是否支持HeadTracker,即它是否具有必要的传感器.为此,我需要知道HeadTracker使用哪些传感器,以便我可以查询这些传感器是否存在.这些传感器是什么?
2)有没有办法在AndroidManifest中指定必要的传感器?据我所知,没有办法.因此,如果用户下载我的应用程序,则应用程序必须在运行时通知用户他的设备不受支持.这不好.有什么想法吗?
我有一个有两个活动的应用程序:"A"和"B".
"A"用于startActivityForResult()
产生"B",即它等待"B".现在,假设"B"在前景中.Android系统可以破坏活动"A"而不会破坏"B"吗?(如果是,那么当"B"完成时,例如在用户输入之后,必须重新创建活动"A"并由Android系统再次放到前台,我需要记住并将"A"恢复到其早期的UI状态. )
请注意,我不是在讨论进程终止(这是不同的情况:如果进程被终止,所有活动都被终止,并且onDestroy()未被调用或无法保证被调用).问题仅在于在等待子活动的结果时是否可以使用onDestroy().
我的Android应用程序将使用大而大的文件(即大小在10MB到2GB之间).
我一直想知道智能手机用于稳定存储的硬件是什么,以及软件(文件读取/搜索)注意事项是否与PC硬盘类似.我试图找到有关硬件的信息并且有一些关于它的图片(内部存储,SD卡),但我检查的所有来源都不是全面和/或具体的.我(相互关联的)问题是:
InputStream
阅读和搜索方面(skipBytes),使用内部存储和SD卡之间是否存在差异(例如在Android上)(我故意不写"外部存储",因为它不一定是每台设备上的SD卡)?SD卡速度慢吗?BufferedInputStream.read()
(例如在a中DataInputStream
)来读取它们(并skipBytes()
在必要时用于搜索).因此,在底层文件系统中,这可能需要"遍历"整个2GB文件.(例如Android在需要时使用linux函数在文件中搜索.)然而,正在寻求像PC硬盘一样高效吗?在寻求效率方面,SD卡与内部存储有何关系?我知道我的具体应用的基准测试是必须的,但我也欢迎在这个问题上进行理论上的澄清.
重要提示:当我问"......正在寻求与PC硬盘一样高效吗?"时,我(不)只是指绝对值,而是它的机制.也就是说,如果它基于相同的逻辑原理工作(=尽可能跳过大部分),或者存在一些缺点(例如,在SD卡上不能进行这种"基于跳过的"搜索,因此跳过更多 - - 即非比例 - 在智能手机硬件上比在PC硬盘上无用.
这篇文章分为两个主要部分.第一部分介绍了原始测试用例和结果,以及我对它的看法.第二部分详细介绍了修改后的测试用例及其结果.
该主题的原始标题是"对阵列的完全迭代明显快于链接列表".由于更新的测试结果(见第二部分),标题发生了变化.
对于完整的单向顺序遍历,已知链表和数组具有相似的性能,但由于连续数组的缓存友好性(引用局部性),它可以(稍微)更好地执行.为了了解它在实践中是如何工作的(Android,Java),我检查了上述说法,并进行了一些测量.
首先,我天真的假设.我们来看看下面的课程:
private static class Message {
public int value1;
public Message next;
public Message(java.util.Random r, Message nextmsg) {
value1 = r.nextInt();
next = nextmsg;
}
}
Run Code Online (Sandbox Code Playgroud)
在第一个测量场景中,next
根本不会使用其字段.下面的代码创建了一个包含1,000,000个Message
实例的数组,然后在循环中遍历数组.它测量迭代花费的时间.
Log.i("TEST", "Preparing...");
final int cnt = 1000000;
int val = 0;
java.util.Random r = new java.util.Random();
Message[] messages = new Message[cnt];
for (int i = 0; i < cnt; i++) {
messages[i] = new Message(r, null);
}
Log.i("TEST", "Starting iterating...");
long start = SystemClock.uptimeMillis();
for …
Run Code Online (Sandbox Code Playgroud) 我被分配到一个Android-Java(实时游戏)项目,该项目具有相当大的(部分遗留的)代码库.
我看到的大多数循环都是这样的(其中mjk通常是Java数组):
int count = mjk.length;
for (int i = 0; i != count; ++i) {
// Stuff dealing with mjk[i]
}
Run Code Online (Sandbox Code Playgroud)
我通常写这样的循环:
int count = mjk.length;
for (int i = 0; i < count; i++) {
// Stuff dealing with mjk[i]
}
Run Code Online (Sandbox Code Playgroud)
知道为什么原作者(我到目前为止无法联系)使用以前的表格?它在C++中很常见吗?
我问这个实际的原因是JIT优化:据我所知,Android优化了循环(归纳变量,不变量,范围检查迁移到循环序言等),我想知道不相等是否可能阻止这种优化(不像更低) -than,指定明确定义的范围).
我只是好奇第一次使用是否比第二次使用有任何优点/缺点(在所有方面).
我遇到了一个非常奇怪的现象(测试设备:HTC Desire HD,Android 2.3.5).我知道这System.gc()
是不必要的和沮丧的,我不会尝试另外建议,但关键是它不应该引起问题(即它最多应该是无用的).
我有一个GLSurfaceView
在其视图层次结构中包含a的应用程序.该GLSurfaceView
实例化和增加Activity.onCreate()
.通常,应用程序的工作方式如下:
GLSurfaceView
来View.VISIBLE
GLSurfaceView
Activity.finish()
被调用)我Activity.onPause()
看起来像这样:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,一切正常.但是,在我添加以下代码后出现问题onPause()
(对于用户从主菜单退出游戏的情况):
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
System.gc();
}
Run Code Online (Sandbox Code Playgroud)
详细说明:如果Activity
是第一次 …
我想知道是否decodeResource (Resources res, int id, BitmapFactory.Options opts)
考虑drawable-ldpi,mdpi,hdpi等文件夹.
我检查了源代码,它看起来不像那样,但我可能会遗漏一些东西.
(一般来说,R.drawable.在Android源代码中已解决?我无法找到它.)
我遇到过下面的代码,我想知道它是否完全符合我的想法:
synchronized(sObject) {
mShouldExit = true;
sObject.notifyAll()
while (!mExited) {
try {
sObject.wait();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于上下文:还有另一个线程检查mShouldExit
(在sObject
监视器内)并在这种情况下退出.
这看起来对我来说不是一个正确的模式.如果发生中断,它将再次设置中断状态,所以当它返回时sObject.wait()
,会出现另一个InterruptedException等等.因此,它永远不会进入真正的等待状态(sObject.wait()
),即它永远不会释放sObject
监视器.这可能导致无限循环,因为另一个线程无法将mExiting设置为true,因为它永远不会进入sObject的监视器.(所以我认为这个interrupt()
电话是错误的,不能在这里使用.)我错过了什么吗?
请注意,代码段是官方Android框架源代码的一部分.
更新:实际上,情况更糟,因为在GL渲染开始时Android中使用了相同的模式.官方源代码GLSurfaceView.GLThread.surfaceCreated()
:
public void surfaceCreated() {
synchronized(sGLThreadManager) {
if (LOG_THREADS) {
Log.i("GLThread", "surfaceCreated tid=" + getId());
}
mHasSurface = true;
sGLThreadManager.notifyAll();
while((mWaitingForSurface) && (!mExited)) {
try {
sGLThreadManager.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以用类似的方式重现错误:确保您的UI线程还有其中断状态标志,然后添加您的GLSurfaceView并启动GL渲染(通过setRenderer(...)
,但在某些设备上,确保您的GLSurfaceView具有 …
我的应用程序(游戏)的主菜单使用标准的Android按钮.它在我的所有设备上运行良好,除了使用Android 4.4.2的Nexus 7.问题如下:
在以下任何一种情况下,按钮的文本突然消失:
setEnabled(boolean)
在按钮上调用例如,如果我按下"加载游戏",则在按下事件期间按钮会正确突出显示,但"加载游戏"会完全消失(该按钮具有空文本).
如果我删除所有自定义样式和行为,并仅使用默认字体等默认Android按钮,则问题仍然存在.
如果我将targetSdkVersion减少到18(从19),即使在Nexus 7上一切正常.
知道KitKat在这方面有什么变化吗?我没有发现任何可疑的东西.
我的revalant XML代码:
<TableLayout
android:id="@+id/layoutGameMainmenu"
android:layout_width="wrap_content"
android:layout_height="83dip"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="vertical"
android:gravity="center_vertical"
android:visibility="gone" >
<TableRow>
<Button
android:id="@+id/buttonLoadGame"
android:layout_width="174dip"
android:layout_height="40dip"
android:layout_marginBottom="2dip"
android:layout_marginRight="30dip"
android:background="@drawable/button_gamemainmenu"
android:text="buttonLoadGame"
android:textColor="@color/button_gamemainmenu_text"
android:textScaleX="0.9"
android:textSize="16dp" />
<Button
android:id="@+id/buttonSettings"
android:layout_width="174dip"
android:layout_height="40dip"
android:layout_marginBottom="2dip"
android:layout_marginLeft="30dip"
android:background="@drawable/button_gamemainmenu"
android:text="buttonSettings"
android:textColor="@color/button_gamemainmenu_text"
android:textScaleX="0.9"
android:textSize="16dp" />
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonStartGame"
android:layout_width="174dip"
android:layout_height="40dip"
android:layout_marginBottom="1dip"
android:layout_marginRight="30dip"
android:background="@drawable/button_gamemainmenu"
android:text="buttonStartGame"
android:textColor="@color/button_gamemainmenu_text"
android:textScaleX="0.9"
android:textSize="16dp" />
<Button
android:id="@+id/buttonQuit"
android:layout_width="174dip"
android:layout_height="40dip"
android:layout_marginBottom="1dip"
android:layout_marginLeft="30dip"
android:background="@drawable/button_gamemainmenu"
android:text="buttonQuit"
android:textColor="@color/button_gamemainmenu_text"
android:textScaleX="0.9"
android:textSize="16dp" />
</TableRow>
</TableLayout>
Run Code Online (Sandbox Code Playgroud)
关于上述代码的重要说明: …
android ×9
java ×6
android-view ×1
arrays ×1
bitmap ×1
button ×1
drawable ×1
for-loop ×1
inputstream ×1
iteration ×1
linked-list ×1
ondestroy ×1
screen ×1
seek ×1
smartphone ×1