小编zap*_*apl的帖子

Android:变量在while循环中具有不正确的值

在Android Studio中开发Android应用时,while循环中使用的变量的值不正确.我在测试用例中将它减少到一个非常简单的情况:

  1. 在Android Studio中创建一个新项目,空白活动
  2. 将以下代码添加到主活动

方法onStart:

@Override
public void onStart() {
    super.onStart();

    int count = 2;
    int index = 1;

    int value = 23;

    Log.i("test", "value before = " + value);
    while (index < count) {
        Log.i("test", "value in while loop = " + value);
        index++;
        value = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

执行测试应用程序时的输出是:

value before = 23
value in while loop = 0
Run Code Online (Sandbox Code Playgroud)

而结果应该是

value in while loop = 23
Run Code Online (Sandbox Code Playgroud)

在调试时,结果如预期的那样('while while = 23'中的值),但在常规的调试版本中,它是错误的.主活动类的反汇编代码看起来没问题,变量'value'的值在while循环体的末尾设置为0.当while循环体中的某些代码或函数使用变量'value'时,它将具有值0而不是23.在测试用例中,我使用Log语句来简化.

当我改变线路时,它不会出错

value = 0;
Run Code Online (Sandbox Code Playgroud)

if (value …
Run Code Online (Sandbox Code Playgroud)

java optimization android runtime-error samsung-mobile

18
推荐指数
1
解决办法
837
查看次数

INSERT OR REPLACE +外键ON DELETE CASCADE工作得太好了

我目前正在尝试创建一个sqlite数据库,我可以从另一个sqlite数据库导入一个表(无法附加)并向每个列添加一些额外的数据.

因为没有INSERT OR UPDATE我提出这个:
我正在考虑将数据分成两个表并在之后加入它们所以我可以将整个导入转储到一个表中,替换所有更改并分别管理额外数据,因为这不会改变在进口.

第一个表(让我们称之为base_data)看起来像

local_id | remote_id | base_data1 | base_data2 | ...
---------+-----------+------------+------------+----
Run Code Online (Sandbox Code Playgroud)

除了local_id一切都只是远程数据库的镜像(我可能会添加一个同步时间戳,但现在无关紧要).

第二个表看起来很相似,但remote_id设置为外键

remote_id | extra_data1 | extra_data2 | ...
----------+-------------+-------------+----

   CREATE TABLE extra_data (
       remote_id INTEGER 
           REFERENCES base_data(remote_id)
           ON DELETE CASCADE ON UPDATE CASCADE
           DEFERRABLE INITIALLY DEFERRED,
       extra_data1 TEXT,
       extra_data2 TEXT,
       /* etc */
   )
Run Code Online (Sandbox Code Playgroud)

现在我的想法只是简单的INSERT OR REPLACE INTO base_data ...值,因为我导入的数据库没有同步时间戳或任何东西,我将不得不比较一切,以找出我有什么行UPDATE/什么INSERT.

但这里存在的问题INSERT OR REPLACE是:实际上是一个DELETE后跟a INSERT和删除部分触发外键 …

sqlite

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

SQLite:group_concat()多列

我有一个问题:

在我的SQLite(android上的sqlite3)数据库中,我有一个像这样的表

company |  name    | job
--------------------------
      1 |  'Peter' | 'Manager'
      1 |  'Jim'   | (null)
      2 |  'John'  | 'CEO'
      2 |  'Alex'  | 'Developer'
      3 |  'Lisa'  | (null)
Run Code Online (Sandbox Code Playgroud)

而且我想去

company | formated
--------------------------------------
      1 | 'Peter (Manager), Jim'
      2 | 'John (CEO), Alex (Developer)'
      3 | 'Lisa'
Run Code Online (Sandbox Code Playgroud)

到目前为止我得到的是

SELECT group_concat(concat) FROM (
    SELECT
        CASE 
            WHEN job IS NULL THEN name
            ELSE name || ' (' || job || ')'
        END AS concat
    FROM jobs
) …
Run Code Online (Sandbox Code Playgroud)

sqlite

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

Roboto字体高度不一致

我目前正面临Android的字体Roboto的奇怪问题.起初我在一个水平LinearLayout中有两个TextView,垂直和水平居中.第一个TextView是字体Roboto-Black.ttf,第二个是Roboto-Light.ttf.两者都设置为textSize ="12sp",但是Roboto-Light.ttf的那个只比Roboto-Black.ttf TextView高出一个像素.但是当我设置textSize ="13sp"时没有发生.所以我创建了新的Android项目,只是为了确保它不仅仅在一个应用程序中.结果几乎相同,但在这种情况下,textSize ="12sp"按预期工作,但textSize ="13sp"则不然.我制作了截图以显示问题.

12sp按预期工作.顶边对齐. 图片

13sp有这种奇怪的行为. 图片

奇怪的是,只有当我尝试混合薄而粗的衬里变体时才会发生这种情况.当我做一个的TextView的Roboto-Bold.ttf和第二的Roboto-Black.ttf,效果良好.当我尝试使用Roboto-Light.ttf和Roboto-Thin.ttf时,它也能正常工作.

所以我也尝试在photoshop中测试这个,这就是我发现的:

图片

对于Roboto家族的所有字体都是一样的,除了Roboto-Light.ttf.如果需要,我也可以发布布局的源代码.

提前致谢.

PS:我很抱歉链接,但由于声誉低(全新的帐户)我无法发布图片.同样在最后一个链接中我不得不从"http"中删除"h",因为它不允许我超过两个链接.

android font-size

7
推荐指数
1
解决办法
1483
查看次数

在Fragment中显示确认对话框

我正在将我的Android应用程序转换为使用片段.以前,我有一个活动,现在是一个片段.因此,不能再使用此代码:

showDialog(CONFIRM_ID);
// ...
@Override
public Dialog onCreateDialog(int id) {
    // Create the confirmation dialog...
}
Run Code Online (Sandbox Code Playgroud)

Fragment对象内部,我需要显示一个确认对话框,确认后会将我返回到对象以进行状态更新.

例如

  1. 里面片段X.
  2. 显示确认对话框.
  3. 如果"是"更新X的UI.

我怎么能做到这一点?请提供工作示例代码.

android android-fragments android-fragmentactivity

6
推荐指数
1
解决办法
7976
查看次数

在SQLiteOpenHelper.onDowngrade()中删除数据库文件的好架构

我有一个基于的现有数据库SQLiteOpenHelper有几个版本和代码来升级它,并且工作正常.但是如果用户安装了旧版本的应用程序(需要较低的数据库版本),它将会崩溃 - ContentProvider使用它无法访问数据库.我想防止它崩溃,但我不想实际降级数据库 - 添加代码来做这件事会很痛苦.删除所有表肯定会起作用,但从一个新文件开始是更清洁,更不容易出错.

这是关于数据库助手的样子 - 没什么特别的

public class MyDbHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 3;
    private static final String DATABASE_NAME = "my.db";

    public MyDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        onUpgrade(db, 0, DATABASE_VERSION);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion < 1) db.execSQL("CREATE TABLE A...");
        if (newVersion < 2) db.execSQL("CREATE TABLE B...");
        if (newVersion < 3) db.execSQL("CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

android android-contentprovider

6
推荐指数
1
解决办法
3968
查看次数

在命名空间和类之间切换的括号?

使用旧版 javascript,我大致遇到了以下 js 代码

// module1.js
class Class {
    constructor() { console.log('hello') }
}
const exported = {
    Class: Class,
}
module.exports = exported
Run Code Online (Sandbox Code Playgroud)

在打字稿中是这样使用的

// module2.ts
import Module1 from './module1'

class Subclass extends Module1.Class { // <<
    ...
Run Code Online (Sandbox Code Playgroud)

这里 vscode 显示错误和以下类型提示

(alias) const Module1: {
    Class: typeof Class;
}
import Module1
----------------------------------------
Cannot find namespace 'Module1'. ts(2503)
Run Code Online (Sandbox Code Playgroud)

我很好奇的是,在玩完之后我添加了括号,如下所示

class Subclass extends (Module1).Class {
Run Code Online (Sandbox Code Playgroud)

vscode 不再显示错误。这个错误是什么?那些括号的含义是什么?我找不到有关命名空间、导入别名等的任何内容...

顺便说一下,使用 tsc 编译时没有错误,代码可以以任何方式工作。

tsconfig 的一些相关部分(nodejs、ts 4.8.2)

    "target": "es2019",
    "module": "commonjs",
    "allowJs": true,
    "checkJs": false, …
Run Code Online (Sandbox Code Playgroud)

typescript visual-studio-code

6
推荐指数
1
解决办法
179
查看次数

在类中使用枚举时出现 Java.lang.NoClassDefFoundError

java.lang.NoClassDefFoundError我在部署代码时感到很奇怪。编译时没有错误,但是当我使用 jetty 部署它时,出现错误

org.springframework.beans.factory.BeanCreationException:
 Error creating bean with name 'org.springframework.dao.annotation.
                                  PersistenceExceptionTranslationPostProcessor#0'
 defined in class path resource [applicationContext-dao.xml]:
  Initialization of bean failed;

nested exception is 
 org.springframework.beans.factory.BeanCreationException:
  Error creating bean with name 'sessionFactory'
  defined in class path resource [applicationContext-dao.xml]:
   Invocation of init method failed;

nested exception is
 java.lang.NoClassDefFoundError: com/core/model/Webhook$Event
Run Code Online (Sandbox Code Playgroud)

该类如下所示

public class Webhook extends BaseObject implements Serializable {

    public enum Event {
        ORDER_CREATE,
        ORDER_UPDATE,
        ORDER_DELETE,
        TICKET_CREATE,
        TICKET_UPDATE,
        TICKET_DELETE,
        CUSTOMER_CREATE,
        CUSTOMER_UPDATE,
        CUSTOMER_DELETE,
        MENU_ITEM_UPDATE,
        CHECK_OFFER
    }

    private Event triggerEvent;

    public Event getTriggerEvent() { …
Run Code Online (Sandbox Code Playgroud)

java enums jetty

5
推荐指数
1
解决办法
8739
查看次数

如何在android BLE中将“0xFF”写为特征值?

我正在尝试使用 BluetoothGattCharacteristic 方法 setValue(..) 在香水分配器设备中写入十六进制值 0xFF 。我在回调方法 onCharacteristicWrite() 中获得成功状态代码 0 但设备不执行任何操作,理想情况下它应该发出香味.

下面是我写入特性的示例代码

private void writeCharacteristic(CallbackContext callbackContext, UUID serviceUUID, UUID characteristicUUID, byte[] data, int writeType) {

    boolean success = false;

    if (gatt == null) {
        callbackContext.error("BluetoothGatt is null");
        return;
    }
    BluetoothGattService service = gatt.getService(serviceUUID);
    BluetoothGattCharacteristic characteristic = findWritableCharacteristic(service, characteristicUUID, writeType);
            if (characteristic == null) {
        callbackContext.error("Characteristic " + characteristicUUID + " not found.");
    } else {
        int data2=0xFF;
        characteristic.setValue(data2, BluetoothGattCharacteristic.FORMAT_UINT16, 0);
        characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
        writeCallback = callbackContext;   
        if (gatt.writeCharacteristic(characteristic)) {
            success = true; …
Run Code Online (Sandbox Code Playgroud)

android

5
推荐指数
1
解决办法
6489
查看次数

泽西岛2可能出现内存泄漏?

我最近将我的REST API从Jersey 1迁移到Jersey 2(确切地说是2.22.1).该应用程序作为春季启动应用程序运行.该应用程序收到相当大的流量.我使用JMC(Java Mission Control)分析了应用程序,并注意到Annotations(getEntityAnnotations())消耗了大量内存.jms截图中的更多细节:

jms截图

从屏幕截图中可以看到312个Annotation[]对象拥有1.55 GB的内存(每个阵列大约5 MB).我在getEntityAnnotations()方法中有突破点,并观察到Annotation[]只包含3个注释(HTTP方法,路径和消耗).Annotation对象只有几个字段.我无法解释大字段的原因.调试器截图中的更多细节:

调试器截图

有没有人遇到过类似的问题?

除了jms截图,我们可以观察到一半的内存来自Arrays.copyOf.这是因为类中的getEntityAnnotations()方法OutboundMessageContext克隆了entityAnnotations数组.这个特殊的实施已添加到球衣2.5作为机票JERSEY-2072的一部分.

我正在使用Java 1.8.0_60和spring boot 1.3.2.RELEASE.如果您需要有关应用程序或环境的任何其他详细信息,请与我们联系

java jersey jersey-2.0 spring-boot java-mission-control

5
推荐指数
0
解决办法
537
查看次数