三星 G5 setvisibility 出现空指针异常

2024-01-14

Android 应用代码可在各种设备上成功运行,包括早至 API 14 至 API 19(目标)。但是,Samsung G5 v4.4.4 在尝试为活动设置 Visibilty(true) 时会抛出 NPE。此错误可能仅在最近通过 Sprint 下载升级 G5 操作系统后才开始出现。我们已经审查了许多类型的 NPE 问题和三星特定问题,但似乎没有一个适用。

The log:

01-08 20:58:40.122: W/dalvikvm(7972): threadid=1: 线程因未捕获的异常而退出 (group=0x41963da0)

01-08 20:58:40.132:W/System.err(7972):java.lang.NullPointerException

01-08 20:58:40.132:W / System.err(7972):在android.app.Activity.makeVisible(Activity.java:4355)

01-08 20:58:40.142:W / System.err(7972):在android.app.Activity.setVisible(Activity.java:4336)

01-08 20:58:40.142:W / System.err(7972):在com.taskassure.app.StartTaskActivity.setActivityVisible(StartTaskActivity.java:531)

01-08 20:58:40.142: W/System.err(7972): 在 com.taskassure.app.StartTaskActivity.access$1(StartTaskActivity.java:529)

01-08 20:58:40.142:W / System.err(7972):在com.taskassure.app.StartTaskActivity $ 4.run(StartTaskActivity.java:298)

01-08 20:58:40.142: W/System.err(7972): 在 android.os.Handler.handleCallback(Handler.java:733)

01-08 20:58:40.142: W/System.err(7972): 在 android.os.Handler.dispatchMessage(Handler.java:95)

01-08 20:58:40.142:W / System.err(7972):在android.os.Looper.loop(Looper.java:146)

01-08 20:58:40.142:W / System.err(7972):在android.app.ActivityThread.main(ActivityThread.java:5678)

01-08 20:58:40.142:W / System.err(7972):在java.lang.reflect.Method.invokeNative(本机方法)

01-08 20:58:40.152:W / System.err(7972):在java.lang.reflect.Method.invoke(Method.java:515)

01-08 20:58:40.152: W/System.err(7972): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)

01-08 20:58:40.152:W / System.err(7972):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)

01-08 20:58:40.152:W / System.err(7972):在dalvik.system.NativeStart.main(本机方法)

对 StartTaskActivity 的审查确认我们正在尝试在引发异常时将可见性设置为 true。相关代码段包括:

将启动失败活动的活动 (StartTaskActivity):

/**
* The intent to open the task start confirm dialog. Put in globalspace so
* that data can be added to it from anywhere in this class.
*/
public intent      confirmActivity  = null;

/**
* Sets up the tab view showing the task details and checkpoints, as well as
* setting up the location client to get the most recent location.
*/

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.view_task_activity);
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

...

// initialize confirmActivity so we can add the necessary
// information from our fragments
confirmActivity = new Intent(getApplicationContext(),
    StartTaskActivity.class);
}

将启动 StartTaskActivity 的类中的相关方法

/** * 向服务器发送启动任务的请求,获取任何检查点 * 在我们开始任务之前需要覆盖的警告。之上 * 覆盖任何警告(如果有) StartTaskActivity 已启动。 */

private void requestTaskStart()
{

...
          try
          {
            JSONObject JsonResponse = new JSONObject(responseBody);
            JSONArray checkpoints = (JSONArray) JsonResponse
                .get("chekpoint_status");

            JSONObject userData = new JSONObject(getIntent().getExtras()
                .getString("user"));
            userData = userData.getJSONObject("user");
            confirmActivity.putExtra("training_set_size", new JSONObject(
                getIntent().getExtras().getString("user"))
                .getInt("training_set_size"));
            confirmActivity.putExtra("requestStartInfo",
                responseBody);
            confirmActivity.putExtra("user_id",
                Integer.parseInt(userData.getString("id")));
            confirmActivity.putExtra("taskId", task.getInt("id"));

            mDialog.dismiss();

            // show checkpoint override if there are any
            if ( checkpoints.length() != 0 )
            {
              // show first checkpoint dialog
              showCheckpointDialog(checkpoints, 0);
            }
            else
            {
              startActivityForResult(confirmActivity,
                  CONFIRM_TASK_START);
            }

StartTaskActivity - 在三星G5上引发NPE的活动类

/**
* Activity that is shown after choosing to start a task. Shows the confirmation
* window before a task is started. This activity also handles starting face
* verification if necessary.
*/

public class StartTaskActivity extends Activity
{
    ...
/**
* Creates the task confirm screen, downloads the users photo from the server.
* Checks the task checkpoints to see if face verification needs to be done
* before starting the task. Keeps the activity invisible until all
* checkpoints are properly met.
*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.start_task_confirm_layout);

    Intent launchIntent = getIntent();
    Bundle args = launchIntent.getExtras();

    try
    {
      requestTaskStartData = new JSONObject(args.getString("requestStartInfo"));
      taskCheckpoints = new JSONArray(args.getString("checkpoints"));
      taskId = args.getInt("taskId");

      ((TextView) findViewById(R.id.task_confirm_textview))
          .setText(requestTaskStartData.getString("task_summary"));

      new Thread(new Runnable()
      {
        @Override
        public void run()
        {

            ... 
            // code retrieves an image file from server on separate thread
            // depending on results, call checkVerifyIdentity for additional processing and to show view
            ... 
            checkVerifyIdentity(bmp)

  }).start();

  ((TextView) findViewById(R.id.task_password_content_textview))
      .setText(requestTaskStartData.getString("task_password"));

}
catch ( JSONException e )
{
  ((TextView) findViewById(R.id.task_password_title_textview))
      .setVisibility(TextView.INVISIBLE);

  e.printStackTrace();
}

findViewById(R.id.task_confirm_button).setOnClickListener(
    new View.OnClickListener()
    {

      @Override
      public void onClick(View v)
      {
        setResult(RESULT_OK);
        finish();
      }
    });

findViewById(R.id.task_deny_button).setOnClickListener(
    new View.OnClickListener()
    {

      @Override
      public void onClick(View v)
      {

        setResult(RESULT_CANCELED);
        finish();
      }
    });

}  // end of StartTaskActivity.onCreate

    ...

// Check some parameters, and finish setting up view for display (runs on UI thread)
private void checkVerifyIdentity(final Bitmap bmp)
{
    final Context context = this;
    StartTaskActivity.this.runOnUiThread(new Runnable()
    {
      public void run()
      {
        if ( bmp != null )
        {
          ((ImageView) findViewById(R.id.task_confirm_imageview))
              .setImageBitmap(bmp);
        }
        if ( taskCheckpoints.length() > 0 )
        {
            ... // do some processing
        }
        else
        {
          setActivityVisible();  
        }
      }
    });
}

    ...
/**
* Sets the activity as visible. Should be called once all verifications are
* properly checked.
*/
private void setActivityVisible()
{
    this.setVisible(true);

}

上面的 setVisible 行是 StartTaskActivity 的第 531 行,它最终导致 Samsung G5 出现 NPE,但不会导致我们可以测试的其他设备/版本出现 NPE。正如评论中所反映的,4.4.4 模拟器上的后续测试无法复制该错误。到目前为止,仅在 4.4.4 版本的实际 Samsung G5 上观察到错误。

UPDATE:

基于一个劳动密集型调试步骤过程 https://stackoverflow.com/questions/27891436/incorrect-java-open-source-view-when-stepping-in-eclipse-with-live-device-connec通过将良好的源视图(4.4.4 模拟器)与三星不正确的源视图进行映射,我们已经缩小了 NPE 原因的范围。应用程序在调用 StartTaskActivity.setActivityVisible 时会抛出 NPE,最终会遇到 null 对象。由于跟踪过程的限制,我无法确定该对象是什么,但我猜测它是窗口或视图。引发该问题的代码行是“mDecor.setVisibility(View.VISIBLE)”(Samsung 中的第 4355 行 = Activity.java 模拟器中的第 4143 行)。因此,从技术上讲,mDecor 对象的某些部分为 null。

可能会采取不同的方法来实现我们的目标,因为我们无法确定为什么 Samsung v4.4.4 会抛出 NPE,而其他设备/模拟器(包括 Samsung v4.4.2)似乎不会抛出 NPE。也许即使这个问题尚未解决,但将来可能对其他人有用。


我们花费了大量时间试图找出此问题的原因。除了运行 4.4.4 的 Samsung G5 (Sprint) 之外,我们无法在任何其他设备或模拟器上重现 NPE 异常。当尝试在一个活动上使用 setVisible 方法时,会发生崩溃,该活动具有从 onCreate 中启动的后台线程,然后该线程启动 runningOnUiThread。也许这是一种不正确的做法,由于某种原因没有受到其他系统的困扰,但三星(至少)发现这是不可接受的。

无论如何,我们通过显示/隐藏与活动关联的视图来解决这个问题(例如使用v.setVisibility(View.VISIBLE)以及一些有价值的重构。正如 Android 文档所示,请谨慎使用 Activity#setVisible 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三星 G5 setvisibility 出现空指针异常 的相关文章

  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • Hibernate:插入问题 - 找不到父键

    我在将实体插入数据库时 遇到问题 我正在使用 Hibernate JPA 这是我的数据库结构 Table User CGU USER ID as PK Table Industries CGI INDUSTRY ID PK CGI INDU
  • PHP 中带有类型提示的动态返回类型?

    对于标准方法 我知道可以在注释中指定返回类型 例如 Load this entity from the database with the specified primary key param int Key return BaseEnt
  • 如何避免重复常见的可观察配置?

    我正在使用 Retrofit 在 Android 中编写一个 API 客户端 这种代 码会重复很多次 myObservableFromRetrofit subscribeOn Schedulers io observeOn AndroidS
  • 如何将RequestMappingHandlerMapping和资源处理程序添加到Spring MVC配置类

    我有一个像这样的 Spring MVC 配置类 Configuration EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter Bean public In
  • Flutter:我可以将参数传递给按钮上 onPress 事件中定义的函数吗?

    我有一个简单的表单 带有一个用于计算表单的按钮 我认为最好点击按钮开始计算操作并将变量传递给哑函数 而不是让函数知道它不需要知道的文本字段 我可以这样做吗 或者我的计算函数是否需要访问我的文本字段 new Container color C
  • 使用 JavaScript 滚动时响应式动画页面元素 [编辑:视差滚动]

    我确信这个问题过去曾被提起过 然而我对一个术语不知所措 On this web page https squareup com careers creative对于 square 用户滚动浏览标题为 在 Square 不同学科协作设计精美简
  • ImageFont.textsize()返回值的单位是什么?

    我正在尝试使用 PIL 来预先计算给定文本行在给定字体和大小下所采用的大小 PIL 似乎或多或少是唯一可行的解 决方案 我不确定返回值的单位是什么font textsize The doc http effbot org imagingbo
  • 在绘图和小平面条之间移动轴标签

    我试图将小面条移动到图的最左侧 以便标签位于条形旁边 分组条位于其左侧 请参见下面的示例 我认为这必须通过 Grob 来完成 但我对这种级别的操作缺乏经验 并且希望得到指导 Data structure list dept structur
  • 如何在存储过程中迭代记录集?

    我需要从存储过程迭代记录集 并使用每个字段作为参数执行另一个存储过程 我无法在代码中完成此迭代 我在互联网上找到了示例 但它们似乎都涉及计数器 我不确定我的问题是否涉及计数器 我需要相当于 T SQL 的foreach 目前 我的第一个存储
  • 如何使用多行字符串示例比较 Cucumber 步骤中的 xml 输出?

    Chargify 在他们的项目中有这个 Cucumber 场景docs http docs chargify com api customers api usage xml customers read Scenario Retrieve
  • 想要在按我的应用程序的启动器图标后返回到上一个活动

    假设我有一个活动 A 启动活动 B 并自行终止 现在 我按下主页按钮 或以其他方式离开应用程序 导致活动 B 的 onPause gt onStop 然后再次单击启动器中的应用程序图标 所发生的情况是 活动 A 再次启动 当然是因为我在清单
  • 使用 C# 替换本机 .exe 中的字符串

    如何捕获本机 Windows exe 文件中的所有字符串 并稍后使用 C 将它们替换为其他字符串 背景 我想创建一个 C 工具来从简单的 exe 文件中提取和替换字符串 这有可能吗 您需要启动一个 PE COFF 解析器 如果你的字符串存储
  • 使用sql从多个字段中选择不同的字段

    我有 5 列对应于问答游戏数据库中的答案 对 错 1 错 2 错 3 错 4 我想返回所有可能的答案而不重复 我希望在不使用临时表的情况下完成此任务 是否可以使用类似的东西 select c1 c2 count from t group b
  • 受保护的成员/字段真的那么糟糕吗?

    现在 如果您阅读 MSDN 中 C 的命名约定 您会注意到它指出属性始终优先于公共字段和受保护字段 有些人甚至告诉我 你永远不应该使用公共或受保护的领域 现在我同意我还没有找到需要拥有公共领域的理由 但受保护的领域真的那么糟糕吗 如果您需要
  • 原始变量和引用变量的内存分配[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions type name 对于引用类型 这
  • Java:返回 java.util.Date 格式的字符串[重复]

    这个问题在这里已经有答案了 我将以 201201 格式接收输入 即 YYYYMM 格式 现在我想按原样返回值 201201 但它应该采用 java util Date 格式 我很困惑 String strDate 201201 Simple
  • Hadoop 溢出故障

    我目前正在开发一个使用 Hadoop 0 21 0 985326 以及一个由 6 个工作节点和一个头节点组成的集群的项目 提交常规 MapReduce 作业失败 但我不知道为什么 以前有人见过这个异常吗 org apache hadoop
  • MS-SQL 查询 - 更新通过存储过程检索的记录

    UPDATE 现在范围已经稍微扩大了 我现在需要检索字段 Id uri linkTo 这如何改变事情 我正在使用 MS SQL 2005 数据库并具有以下存储过程 CREATE PROCEDURE dbo getNewAds region
  • 将数据发送到单独的窗口 javascript

    我使用以下命令从现有页面创建了一个新的弹出窗口 window open myUrl myName width 200 height 200 现在 在该弹出窗口上 我有一个文本输入和一个按钮 我想为按钮创建一个 onclick 方法 将文本输
  • 三星 G5 setvisibility 出现空指针异常

    Android 应用代码可在各种设备上成功运行 包括早至 API 14 至 API 19 目标 但是 Samsung G5 v4 4 4 在尝试为活动设置 Visibilty true 时会抛出 NPE 此错误可能仅在最近通过 Sprint