小编Tho*_*alc的帖子

"RuntimeException:执行暂停未恢复的活动"

(我在stackoverflow上看到一个类似的问题,但答案并不是真正的答案,问题的上下文也有所不同.)

"java.lang.RuntimeException:执行暂停未恢复的活动"

我开发了一个游戏应用程序(使用普通视图和GLSurfaceView).如果我打开和关闭我的手机显示非常快,我可能会导致此异常有时(由ActivityThread抛出),但我的应用程序异常后正常运行.我的应用程序是横向应用程序,也可以在清单中正确设置(包括方向和配置更改).

这个可以吗?

这是ActivityThread在我的应用程序的应用程序名称下抛出的RuntimeException,但它不会终止我的应用程序.

android screen runtimeexception android-activity

24
推荐指数
1
解决办法
2万
查看次数

Google Cardboard VR传感器

我正在使用Google Cardboard(它的HeadTracker类)来检测AR应用程序中有关设备旋转的某些事情.它工作得很好.

但是,在某些设备上,它不起作用(没有任何反应).我认为这是因为他们没有必要的传感器.我的问题:

1)我想在运行时检测当前设备是否支持HeadTracker,即它是否具有必要的传感器.为此,我需要知道HeadTracker使用哪些传感器,以便我可以查询这些传感器是否存在.这些传感器是什么?

2)有没有办法在AndroidManifest中指定必要的传感器?据我所知,没有办法.因此,如果用户下载我的应用程序,则应用程序必须在运行时通知用户他的设备不受支持.这不好.有什么想法吗?

java android augmented-reality google-cardboard

17
推荐指数
2
解决办法
6828
查看次数

onDestroy()同时"等待"onActivityResult()

我有一个有两个活动的应用程序:"A"和"B".

"A"用于startActivityForResult()产生"B",即它等待"B".现在,假设"B"在前景中.Android系统可以破坏活动"A"而不会破坏"B"吗?(如果是,那么当"B"完成时,例如在用户输入之后,必须重新创建活动"A"并由Android系统再次放到前台,我需要记住并将"A"恢复到其早期的UI状态. )

请注意,我不是在讨论进程终止(这是不同的情况:如果进程被终止,所有活动都被终止,并且onDestroy()未被调用或无法保证被调用).问题仅在于在等待子活动的结果时是否可以使用onDestroy().

java android ondestroy

16
推荐指数
1
解决办法
4093
查看次数

智能手机上的文件读取性能:内部存储与SD卡与PC硬盘的比较

我的Android应用程序将使用大而大的文件(即大小在10MB到2GB之间).

我一直想知道智能手机用于稳定存储的硬件是什么,以及软件(文件读取/搜索)注意事项是否与PC硬盘类似.我试图找到有关硬件的信息并且有一些关于它的图片(内部存储,SD卡),但我检查的所有来源都不是全面和/或具体的.我(相互关联的)问题是:

  1. 在阅读"现代"智能手机(例如Android 2.2手机)上的大文件时,我必须考虑哪些主要差异,与使用PC的Java应用程序做同样的事情相比?(在磁盘搜索/读取性能方面;显然,手机RAM比PC小,所以在缓冲区等情况下必须考虑到这一点)
  2. 智能手机中使用的稳定存储硬件与PC硬盘之间的(相关)主要区别是什么?(我知道这是一个非常广泛的问题,所以我甚至欣赏这里非常简短的答案以及可能的一些可靠的外部URL)
  3. InputStream阅读和搜索方面(skipBytes),使用内部存储和SD卡之间是否存在差异(例如在Android上)(我故意不写"外部存储",因为它不一定是每台设备上的SD卡)?SD卡速度慢吗?
  4. 例如,我想从2GB文件中读取2MB数据,这个2MB数据分布在文件的许多不同/远端部分.所有偏移都是已知的,因此我创建了偏移的升序,然后使用BufferedInputStream.read()(例如在a中DataInputStream)来读取它们(并skipBytes()在必要时用于搜索).因此,在底层文件系统中,这可能需要"遍历"整个2GB文件.(例如Android在需要时使用linux函数在文件中搜索.)然而,正在寻求像PC硬盘一样高效吗?在寻求效率方面,SD卡与内部存储有何关系?
  5. 什么是典型的数据读取速度?(智能手机内部存储与SD卡与PC非SSD硬盘相比)

我知道我的具体应用的基准测试是必须的,但我也欢迎在这个问题上进行理论上的澄清.

重要提示:当我问"......正在寻求与PC硬盘一样高效吗?"时,我(不)只是指绝对值,而是它的机制.也就是说,如果它基于相同的逻辑原理工作(=尽可能跳过大部分),或者存在一些缺点(例如,在SD卡上不能进行这种"基于跳过的"搜索,因此跳过更多 - - 即非比例 - 在智能手机硬件上比在PC硬盘上无用.

android inputstream smartphone persistent-storage seek

14
推荐指数
1
解决办法
5883
查看次数

数组/链接列表:性能取决于遍历的*方向*?

这篇文章分为两个主要部分.第一部分介绍了原始测试用例和结果,以及我对它的看法.第二部分详细介绍了修改后的测试用例及其结果.

该主题的原始标题是"对阵列的完全迭代明显快于链接列表".由于更新的测试结果(见第二部分),标题发生了变化.


第一部分:原始测试用例

对于完整的单向顺序遍历,已知链表和数组具有相似的性能,但由于连续数组的缓存友好性(引用局部性),它可以(稍微)更好地执行.为了了解它在实践中是如何工作的(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)

java arrays iteration android linked-list

13
推荐指数
1
解决办法
1628
查看次数

循环条件:为什么"不等于"而不是"低于"

我被分配到一个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,指定明确定义的范围).

我只是好奇第一次使用是否比第二次使用有任何优点/缺点(在所有方面).

java for-loop

12
推荐指数
1
解决办法
1027
查看次数

System.gc()导致Activity的第二次启动减慢

我遇到了一个非常奇怪的现象(测试设备:HTC Desire HD,Android 2.3.5).我知道这System.gc()是不必要的和沮丧的,我不会尝试另外建议,但关键是它不应该引起问题(即它最多应该是无用).

我有一个GLSurfaceView在其视图层次结构中包含a的应用程序.该GLSurfaceView实例化和增加Activity.onCreate().通常,应用程序的工作方式如下:

  1. 用户启动应用程序并转到mainmenu
  2. 用户选择该设置一个MainMenu项目GLSurfaceViewView.VISIBLE
  3. 用户使用内置游戏进行游戏 GLSurfaceView
  4. 用户进入mainmenu并退出活动(=> 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第一次 …

android garbage-collection android-layout android-view

11
推荐指数
1
解决办法
2661
查看次数

BitmapFactory.decodeResource和drawable*文件夹

我想知道是否decodeResource (Resources res, int id, BitmapFactory.Options opts)考虑drawable-ldpi,mdpi,hdpi等文件夹.

我检查了源代码,它看起来不像那样,但我可能会遗漏一些东西.

(一般来说,R.drawable.在Android源代码中已解决?我无法找到它.)

android bitmap drawable android-resources

11
推荐指数
1
解决办法
4万
查看次数

在等待退出信号时处理InterruptedException(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具有 …

java multithreading android interrupted-exception

9
推荐指数
1
解决办法
7627
查看次数

KitKat上的按钮文本消失(API级别19)

我的应用程序(游戏)的主菜单使用标准的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)

关于上述代码的重要说明: …

java android button android-4.4-kitkat

9
推荐指数
1
解决办法
1667
查看次数