小编And*_*Dev的帖子

强制终止我没有用Java编写的线程

我到处看看如何在Java中强制停止一个线程,我看到"只需要执行一个退出变量检查,如果你需要强行杀死,你的程序就会被破坏."

我有一个相当独特的情况.我正在编写一个Java程序,它在一个单独的线程中动态加载和运行其他Java类.(请不要对安全风险发表评论,这是一个非常具体的用例).

麻烦的是,由于其他人已经编写了需要加载的类,因此无法保证他们将实现停止检查等等.我需要一种方法来立即终止他们的线程,接受所涉及的所有风险.基本上我想要kill -9他们的线程,如果我需要.我怎么能用Java做到这一点?


更新:这里有更多信息:

  • 这实际上是一个Android应用程序

  • 用户代码取决于我的应用程序中的类

  • 必须对用户类进行注释@UserProgram才能由我的应用程序"注册"

  • 用户还可以选择在应用程序中构建类(通过下载已经编译成库并将其类放在单独模块中的内部类的项目),而不是从JAR动态加载它们.

  • 用户类从我的模板类扩展而来,模板类有一个runUserProgram()覆盖的方法.在这种方法中,他们可以自由地做任何他们想做的事情.他们可以查看isStopRequested()我是否希望他们停止,但我不能保证他们会这样做.

  • 在启动时,我的应用程序加载指定的任何JAR,并扫描应用程序中的所有类和这些JAR中的类,以查找使用上述注释注释的任何类.一旦构建了这些类的列表,就会将其提供给前端,其中UI提供可以运行的程序列表.选择程序后,必须按下"开始"按钮才能实际启动它.按下该按钮后,该按钮将变为"停止"按钮,并向后端发出回调以在新线程中加载所选类并调用该runUserProgram()方法.按下"停止"按钮时,会设置一个导致isStopRequested()返回的变量true.

java multithreading

8
推荐指数
1
解决办法
157
查看次数

如何有效地将位图对象读取为二维整数数组?

我需要在我的Android应用程序中将整个Bitmap对象读取为二维整数数组。

目前,我正在一次分别读取每个像素,如下所示:

for (int y = 0; y < coverImageHeight; y++)
{
    for (int x = 0; x < coverImageWidth; x++)
    {
        coverImageIntArray[x][y] = coverImageBitmap.getPixel(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这在大图像上会花费很长时间(大约15秒)。

有没有一种方法可以一次完成所有操作以提高效率?

java android multidimensional-array android-bitmap

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

findViewById() 在包含的布局上返回 null?

我的活动的 XML 布局中有一个包含的布局,如下所示:

<include
    layout="@layout/info_button"
    android:id="@+id/config_from_template_info_btn"/>
Run Code Online (Sandbox Code Playgroud)

我试图OnClickListener通过执行以下操作为包含的布局内的按钮设置一个:

findViewById(R.id.config_from_template_info_btn)
        .findViewById(R.id.info_btn)
        .setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        //Do things
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,这会在运行时崩溃:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
Run Code Online (Sandbox Code Playgroud)

布局info_btn.xml仅包含按钮小部件,如下所示:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:id="@+id/info_btn"
        ...
        />
</merge>
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

java android

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

Android Studio:库源与类的字节码不匹配

请在投票之前完整阅读以欺骗此!

我编写了一个 Android 库并将测试存档上传到 Bintray。该库在一个干净的 Android Studio 项目中成功地从 Bintary 下拉,并且它工作正常。但是,当为我的库中的一个特定文件选择Go To --> Declaration 时,Android Studio 显示错误。Library source does not match the bytecode for class

现在是的,我已经看到了另一个问题,其中 OP 似乎有完全相同的问题。但是,任何答案中提到的解决方案都没有奏效。

我试过了:

  • 单击Show Diff并选择Ignore whitespaces and empty lines
  • 摇篮清洁
  • 摇篮重建
  • 摇篮同步
  • Android Studio 使缓存无效并重新启动
  • 进行构建 --> 制作项目

奇怪的是,Android Studio 没有抱怨任何其他文件......我能想到的唯一可能甚至可能与远程相关的是有问题的类是abstract.

有谁知道这里会发生什么?我使用的是 Android Studio v3.4.2

android-studio

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

OpenCV(Java)子mat似乎没有与父mat共享缓冲区?

根据我在网上阅读的内容,当您在 OpenCV 中制作子垫时,它会共享父垫的图像缓冲区:

在此输入图像描述

然而,这似乎不是我在 Android 上使用 Java 中的 OpenCV 时遇到的行为。

这是一个制作子垫的片段,然后用纯蓝色填充它。然而,当渲染到屏幕上时,原始垫子保持不变:

//Create submat
submat1 = input.submat(new Rect(sub1pointA, sub1pointB));

//Fill submat with solid color
Imgproc.rectangle(
    submat1 ,
    new Point(0,0),
    new Point(submat1.width(), submat1.height()),
    new Scalar(0, 0, 255), -1);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将调用更改为在垫子rectangle()上进行操作input,那么我确实会在屏幕上看到一个纯蓝色矩形。是什么赋予了?我是否遗漏了一些明显的东西,或者在使用 OpenCV for Java 时子垫不与其父项共享缓冲区?

java android opencv

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

OpenCV JNI:Mat 的 Java/本机处理 - 删除被调用两次的可能性吗?

我正在开发一个项目,其中有一个 Mat 是在本机代码的堆上分配的(应某些 Java 代码的请求),如下所示:

Mat* mat = new Mat(height, width, type, pointer_to_some_native_data_buffer);
Run Code Online (Sandbox Code Playgroud)

然后,我在 Java 中创建一个 Mat 对象,并使用从本机代码返回的指针将其指向该本机 Mat:

Mat javaHandleToNativeMat = new Mat(pointerFromNativeCode);
Run Code Online (Sandbox Code Playgroud)

从 Java 端对其进行一些处理后,我调用一个本机方法来释放一开始分配的 Mat:

delete (Mat*) ptr;
Run Code Online (Sandbox Code Playgroud)

我的问题是,当 GC 在指向本机 Mat 的 Java Mat 上运行终结器方法时,是否会发生本机内存损坏?

终结器代码如下:

    @Override
    protected void finalize() throws Throwable {
        n_delete(nativeObj);
        super.finalize();
    }
Run Code Online (Sandbox Code Playgroud)

请注意,它调用n_delete(nativeObj). 我想知道这是否可能是一个问题,因为我之前在本机代码中删除了该对象。如果出现问题,解决问题的最佳方法是什么?我是否应该简单地调用release()本机 Mat,并允许它在 GC 运行时在终结器中实际删除?

c++ java java-native-interface opencv

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

对齐水平线性布局内的按钮

我正在尝试将水平线性布局内的按钮与我的 Android 应用程序中的屏幕右侧对齐。

我怎样才能做到这一点?我在属性窗格中找不到对齐选项。 我尝试了一些谷歌搜索,但我找不到太多东西,因为我不知道要搜索的正确术语。

这是一个渲染,所以你可以得到一个想法:

在此处输入图片说明

这是我的当前 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button"
            android:layout_gravity="center_vertical" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button3" />
    </LinearLayout>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间!

android button alignment android-layout

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

抓取指向操作栏上选项卡的TextView的指针?

其他一些用户和我正在为Stack Exchange聊天网络开发Android应用程序.我们正在为每个活动添加一个教程,向用户解释UI.但是,我们遇到了一些障碍.

教程库需要一个指向视图的指针(无论是a TextView,ImageView等等),以便在显示中获取视图的坐标,以便知道在哪里绘制阴影和内容.

我们有一项活动使用Android Studio中的标准"标签式活动",因此我们不使用任何自定义工具栏.

操作栏如下所示:

在此输入图像描述

我们想要抓住TextView每个标签上的指针,该标签包含标签的标题.

例如,我们希望能够访问Textview:

在此输入图像描述

我们在互联网上找不到关于如何做到这一点的任何事情都没有真正成功.如果您使用自定义工具栏似乎相对容易,但我们不是.

在AOSP源代码中挖掘,我们发现了一种潜在的方法,但是我们需要访问的字段是private主活动代码中的其他字段,也可能是其中无法访问的字段.

所以问题是,我们怎样才能抓住指针TextView呢?它甚至可能吗?

android android-actionbar-compat android-tabbed-activity

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

C++ 从另一个 C++ 文件“导入”一个枚举类

我是 Java 背景的人,所以请多多包涵 :)

我正在尝试enum class从另一个 C++ 文件“导入”(使用 Java 术语)an ,以便能够直接使用它,而不必在它前面加上类名。

例如,假设我在头文件中有这个:

class Foo
{
    public:
        enum class Bar {ITEM_1, ITEM_2};
        void doThings(Bar bar);
};
Run Code Online (Sandbox Code Playgroud)

现在,目前,如果我想Bar从另一个 C++ 文件中使用,我会这样做:

#include "Foo.h"

void Foo2::methodInAnotherFile()
{
    Foo foo();
    Foo::Bar bar = Foo::Bar::ITEM_2;
    foo.doThings(bar);
}

Run Code Online (Sandbox Code Playgroud)

现在我想要做的是能够执行类似的“进口”(使用Java术语)Bar,以便能够删除需要前缀BarFoo::,即做Bar bar = Bar::ITEM_2;

现在,由于我对 C++ 的了解有限,我能想到的一种方法是将所有代码包围在Foo.hwith 中namespace FooNamespace{},将Bar枚举从类中取出(但仍在命名空间中),然后添加using namespace FooNamespaceFoo2班级。但是,对于我的应用程序来说,这确实没有多大逻辑意义,因为Bar枚举确实在逻辑上属于Foo该类。

由于我精通 Java,下面是我想做的 …

c++ namespaces using

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

将条件链重写为一行序列

我在Java中有这个代码来控制机器人的主臂:

if (gamepad1.left_stick_y > 50)
{
    mainArm.setDirection(DIRECTION_FORWARD);
    mainArm.setPower(50);
}
else if (gamepad1.left_stick_y < -50)
{
    mainArm.setDirection(DIRECTION_REVERSE);
    mainArm.setPower(50);
}
Run Code Online (Sandbox Code Playgroud)

这只是一小部分,但是有很多条件就是这样,如果条件为真,有些只有一个陈述.它可以简化为:[伪代码.不要从字面上理解.我知道它不会起作用]

if (gamepad1.left_stick_y > 50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50);
else if (gamepad1.left_stick_y < -50) mainArm.setDirection(DIRECTION_REVERSE), mainArm.setPower(50);
Run Code Online (Sandbox Code Playgroud)

不幸的是,用于直接与硬件接口以设置电源的库是闭源的,因此修改它们是不可能的.

java conditional

-10
推荐指数
2
解决办法
517
查看次数