我把我的整个程序归结为一个复制问题的简短主题,所以原谅我没有任何意义.
input.txt是一个文本文件,其中包含几行文本.这个简化的程序应该打印这些行.但是,如果调用fork,程序将进入无限循环,在此循环中反复打印文件的内容.
据我所知,我在这个片段中使用它的方式本质上是一个无操作.它分叉,父母在继续之前等待孩子,孩子立即被杀死.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
enum { MAX = 100 };
int main(){
freopen("input.txt", "r", stdin);
char s[MAX];
int i = 0;
char* ret = fgets(s, MAX, stdin);
while (ret != NULL) {
//Commenting out this region fixes the issue
int status;
pid_t pid = fork();
if (pid == 0) {
exit(0);
} else {
waitpid(pid, &status, 0);
}
//End region
printf("%s", s);
ret = fgets(s, MAX, stdin);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:进一步的调查只会使我的问题变得更加奇怪.如果文件包含<4个空白行或<3行文本,则不会中断.但是,如果不止于此,它会无限循环.
Edit2:如果文件包含3行数字,它将无限循环,但如果它包含3行单词则不会.
systemWindowInsetBottom 和 stableInsetBottom 都是 0
我有一个 Activity,它有一个背景纹理,我使用 FLAG_LAYOUT_NO_LIMITS 让该背景位于状态和导航栏后面。但我不希望视图的其他内容落后于那些系统 UI 组件。
一开始我想使用resources.getIdentifier("navigation_bar_height", "dimen", "android")来获取导航栏的高度,但这只是导航栏的默认高度,因此它不适用于用户隐藏导航栏的设备。(三星设备)
然后我发现了 WindowInsets 和 android:fitsSystemWindows="true"
它适用于状态栏,但不适用于导航栏。
在我的活动中
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//These 2 flags don't seem to change anything
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR)
//This flag is required so the background can go behind the navbar
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
rootView.setOnApplyWindowInsetsListener { _, insets ->
val topTextViewParams = rootView.tvTop.layoutParams as ViewGroup.MarginLayoutParams
topTextViewParams.topMargin = insets.systemWindowInsetTop
val bottomTextViewParams = rootView.tvBottom.layoutParams as ViewGroup.MarginLayoutParams
bottomTextViewParams.bottomMargin = insets.systemWindowInsetBottom //Inset is always 0
insets.consumeSystemWindowInsets() …Run Code Online (Sandbox Code Playgroud) 我有一些视图需要以编程方式设置一些边距(来自 applyWindowInsets 侦听器),但这些视图似乎忽略了我用代码设置的任何边距,即使我没有为边距设置动画。
我可以很好地设置填充,但是仅使用填充无法完成我需要的操作。
该问题似乎与 MotionLayout 相关,因为如果它是 ConstraintLayout,它就可以正常工作。
我一直在使用这个 util 方法。
public static void addTopMargin(View v, int margin) {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
}
Run Code Online (Sandbox Code Playgroud) Dart 中的列表是动态调整大小的,除非您在创建时指定大小。
所以我认为动态大小的会像 Java 中的 ArrayList 一样工作,而静态大小的会像 Java 中的 [] 一样工作。
这是正确的,还是总是 O(1) 访问?还是总是 O(n) 访问?
我一直无法在网上找到有关此的任何资源。
Kotlin 提供了 Array.isArrayOf() 来检查数组是否属于某种类型。
它是这样使用的
if(object.isArrayOf<String>())
Run Code Online (Sandbox Code Playgroud)
并像这样定义
/**
* Checks if array can contain element of type [T].
*/
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> Array<*>.isArrayOf(): Boolean =
T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)
但它仅适用于 Array。我需要检查ArrayList。
我想像这样改变签名。
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> ArrayList<*>.isArrayListOf(): Boolean =
T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)
但 class.java.componentType 特定于 Array
如何检查我拥有的 ArrayList 类型?
我应该澄清一下,我只关心它是否是 3 种类型之一,所以我不需要完全开放式的检查方式。
我有一些用于 Retrofit2 的类,并由 Jackson 序列化。
@JsonIgnoreProperties(ignoreUnknown = true)
class GetUserRequest(
@JsonProperty("user_id")
var userId: String? = null
)
Run Code Online (Sandbox Code Playgroud)
它们在调试版本中工作,但是当我在启用 proguard 或 R8 缩小的情况下执行发布版本时,它会缩小类变量(如预期),而且还会缩小 @JsonProperty 生成的任何代码,导致网络请求使用 json 发送,例如{ "a": "123" } 而不是 { "user_id": "123" }
我已经通过 jackson 实现“com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9”实现“com.squareup.retrofit2:converter-jackson:2.6.0”包含了对 kotlin 的支持
我有一些适用于我的 java 类模型对象的 proguard 规则。
-keep class com.fasterxml.jackson.databind.ObjectMapper {
public <methods>;
protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
public ** writeValueAsString(**);
}
-keep class * {
@com.fasterxml.jackson.annotation.JsonCreator *;
@com.fasterxml.jackson.annotation.JsonProperty *;
}
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个多线程双工聊天服务器.在将代码移动到线程之前,我已经正常工作了,但是现在当线程试图访问套接字时,我得到"SocketException:Socket已关闭".
我的老师和我无法理解.(老师比我更了解Java;他是C家伙).套接字似乎是打开的,但只要它进入线程,它就会被关闭.
我究竟做错了什么?
客户代码:
public class Client {
public static void main(String[] args) throws IOException {
String hostName = "localhost";
int portNumber = 6969;
try (
Socket socket = new Socket(hostName, portNumber);
) {
System.out.println("Chat connected");
//Sender
if (!socket.isClosed())
new Thread(new Sender(socket)).start();
//Receiver
if (!socket.isClosed())
new Thread(new Receiver(socket)).start();
} catch (SocketException e) {
System.out.println("Connection terminated unexpectedly");
}
}
}
Run Code Online (Sandbox Code Playgroud)
服务器代码:
public class Server {
public static void main(String[] args) throws IOException {
int portNumber = 6969;
try (
ServerSocket serverSocket …Run Code Online (Sandbox Code Playgroud)