- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序崩溃,除了出现此错误外,没有任何堆栈跟踪:
A/libc: Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 12680 (dio.downloadapp)
val details = gson.fromJson(fileReader, VideoDetails::class.java)
private fun onVideoDetailsFetched() {
try {
val file = File(context.filesDir, QUEUE_VIDEO_DETAILS_FILE)
val fileReader = FileReader(file)
val details = gson.fromJson(fileReader, VideoDetails::class.java)
videoDetails.send(details)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun VideoDetails.saveVideoDetails() {
val json = gson.toJson(this)
File(applicationContext.filesDir, VIDEO_DETAILS_FILE).writeText(json)
}
VideoDetails
只是一个带有一串字符串和一个位图的数据类:
data class VideoDetails(
val filename: String? = null,
val title: String? = null,
val vcodec: String? = null,
val acodec: String? = null,
val duration: String? = null,
val filesize: String? = null,
val width: String? = null,
val height: String? = null,
val bitrate: String? = null,
val framerate: String? = null,
val encoder: String? = null,
val encodedBy: String? = null,
val date: String? = null,
val creationTime: String? = null,
val artist: String? = null,
val album: String? = null,
val albumArtist: String? = null,
val track: String? = null,
val genre: String? = null,
val composer: String? = null,
val performer: String? = null,
val copyright: String? = null,
val publisher: String? = null,
val language: String? = null,
var thumbnail: Bitmap? = null
)
Gson.fromJson()
时发生。前两次,它工作正常。
最佳答案
根本原因是VideoDetails
数据类中的位图。显然,Gson无法处理位图。我决定不删除位图,而是为TypeAdapter
创建一个自定义 VideoDetails
。这样,我不必更改VideoDetails
类,因此不必更改代码的许多部分。
完整代码:
class VideoDetailsTypeAdapter : TypeAdapter<VideoDetails?>() {
override fun write(out: JsonWriter?, value: VideoDetails?) {
value?.apply {
out?.apply {
beginObject()
filename?.let { name(FILENAME).value(it) }
title?.let { name(TITLE).value(it) }
vcodec?.let { name(VCODEC).value(it) }
acodec?.let { name(ACODEC).value(it) }
duration?.let { name(DURATION).value(it) }
filesize?.let { name(FILESIZE).value(it) }
width?.let { name(WIDTH).value(it) }
height?.let { name(HEIGHT).value(it) }
bitrate?.let { name(BITRATE).value(it) }
framerate?.let { name(FRAMERATE).value(it) }
encoder?.let { name(ENCODER).value(it) }
encodedBy?.let { name(ENCODED_BY).value(it) }
date?.let { name(DATE).value(it) }
creationTime?.let { name(CREATION_TIME).value(it) }
artist?.let { name(ARTIST).value(it) }
album?.let { name(ALBUM).value(it) }
albumArtist?.let { name(ALBUM_ARTIST).value(it) }
track?.let { name(TRACK).value(it) }
genre?.let { name(GENRE).value(it) }
composer?.let { name(COMPOSER).value(it) }
performer?.let { name(PERFORMER).value(it) }
copyright?.let { name(COPYRIGHT).value(it) }
publisher?.let { name(PUBLISHER).value(it) }
language?.let { name(LANGUAGE).value(it) }
thumbnail?.let {
name(THUMBNAIL).beginArray()
val pixelInts = IntArray(it.width * it.height)
it.getPixels(pixelInts, 0, it.width, 0, 0, it.width, it.height)
val storeInts = IntArray(pixelInts.size + 2)
pixelInts.copyInto(storeInts, 0, 0, pixelInts.size)
storeInts[storeInts.size - 2] = it.width
storeInts[storeInts.size - 1] = it.height
for (int in storeInts)
value(int)
endArray()
}
endObject()
}
}
}
override fun read(`in`: JsonReader?): VideoDetails? {
return `in`?.run {
beginObject()
val entries = Array<String?>(24) { null }
var thumbnail: Bitmap? = null
while (hasNext()) {
when (nextName()) {
FILENAME -> entries[0] = nextString()
TITLE -> entries[1] = nextString()
VCODEC -> entries[2] = nextString()
ACODEC -> entries[3] = nextString()
DURATION -> entries[4] = nextString()
FILESIZE -> entries[5] = nextString()
WIDTH -> entries[6] = nextString()
HEIGHT -> entries[7] = nextString()
BITRATE -> entries[8] = nextString()
FRAMERATE -> entries[9] = nextString()
ENCODER -> entries[10] = nextString()
ENCODED_BY -> entries[11] = nextString()
DATE -> entries[12] = nextString()
CREATION_TIME -> entries[13] = nextString()
ARTIST -> entries[14] = nextString()
ALBUM -> entries[15] = nextString()
ALBUM_ARTIST -> entries[16] = nextString()
TRACK -> entries[17] = nextString()
GENRE -> entries[18] = nextString()
COMPOSER -> entries[19] = nextString()
PERFORMER -> entries[20] = nextString()
COPYRIGHT -> entries[21] = nextString()
PUBLISHER -> entries[22] = nextString()
LANGUAGE -> entries[23] = nextString()
THUMBNAIL -> {
beginArray()
val intList = mutableListOf<Int>()
while (hasNext())
intList.add(nextInt())
endArray()
val storeInts = intList.toIntArray()
val pixelInts = IntArray(storeInts.size - 2)
storeInts.copyInto(pixelInts, 0, 0, storeInts.size - 2)
val width = storeInts[storeInts.size - 2]
val height = storeInts[storeInts.size - 1]
thumbnail = Bitmap.createBitmap(pixelInts, width, height, Bitmap.Config.ARGB_8888)
}
}
}
endObject()
VideoDetails(
entries[0],
entries[1],
entries[2],
entries[3],
entries[4],
entries[5],
entries[6],
entries[7],
entries[8],
entries[9],
entries[10],
entries[11],
entries[12],
entries[13],
entries[14],
entries[15],
entries[16],
entries[17],
entries[18],
entries[19],
entries[20],
entries[21],
entries[22],
entries[23],
thumbnail
)
}
}
companion object {
const val FILENAME = "filename"
const val TITLE = "title"
const val VCODEC = "vcodec"
const val ACODEC = "acodec"
const val DURATION = "duration"
const val FILESIZE = "filesize"
const val WIDTH = "width"
const val HEIGHT = "height"
const val BITRATE = "bitrate"
const val FRAMERATE = "framerate"
const val ENCODER = "encoder"
const val ENCODED_BY = "encodedBy"
const val DATE = "date"
const val CREATION_TIME = "creationTime"
const val ARTIST = "artist"
const val ALBUM = "album"
const val ALBUM_ARTIST = "albumArtist"
const val TRACK = "track"
const val GENRE = "genre"
const val COMPOSER = "composer"
const val PERFORMER = "performer"
const val COPYRIGHT = "copyright"
const val PUBLISHER = "publisher"
const val LANGUAGE = "language"
const val THUMBNAIL = "thumbnail"
}
}
IntArray
,然后它包含位图中每个像素的Int值以及位图的宽度和高度,作为该数组的最后两个条目。然后将此
IntArray
转换为
Json
。将其转换回Bitmap只需逆转此过程即可。
TypeAdapter
注册到
Gson
。
private val gson = GsonBuilder()
.registerTypeAdapter(VideoDetails::class.java, VideoDetailsTypeAdapter())
.create()
关于android - 使用Gson时,TID 12680中的致命信号11(SIGSEGV),代码128,故障加法器0x0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60185298/
这个 MySQL 查询有其他选择吗? SELECT * FROM type WHERE tid='1' OR tid='2'; 这里的 type 是表格,tid 是表格的 ID,我想以任何方式选择前
我有这个通用类,它使用 Entity Framework 6.x。 public class GenericRepository where TEntity, class, IIdentifyable
我正在使用 glib 创建线程: g_thread_create() 如何获取线程id(编号)? 最佳答案 你不能。线程 ID 在 GLib 中被抽象出来。你需要它做什么? 关于glib - glib
我正在使用 std::thread 来启动线程。另外,我需要 /proc/[pid]/tasks/[tid] 中提供的工作线程的统计信息。我需要 tid 才能监视线程统计信息。我想知道是否有办法从父线
http://www.cs.colostate.edu/~cs370/Spring15/Workbook/thread_ex.txt 我的教授提供了上面的示例代码(没有复制以保护他的 IP),我对输出
在 Linux ps -eLf | grep my-process-name给出了我的进程中的线程列表以及每个线程的 TID。 在 OSX 上 ps -M pid给了我线程列表,但没有显示每个线程的
当 TID 响应 kill 系统调用时,有什么方法可以检测到 PID 真的死了,然后就像进程仍然存在一样。 #include #include #include #include #inclu
我创建了一个多线程模拟器,它严重依赖于线程之间传递的 native 消息(不要告诉我去单线程它是为了我关于 D 的论文,我需要让它工作) 在一次非常耐用的杂物之后,涉及到和来自 shared 的大量物
我发现在下面的代码中,每次接受新客户端时都会创建一个线程。在函数 pthread_client() 中没有退出日志。但是似乎没有通过命令 ps aux 创建多线程 我的理解是,每次创建一个具有相同ti
我一直在尝试使用 tgkill 远程终止一个线程。我知道pthread_kill 被推荐用于这种事情,因为没有任何 glibctgkill 的包装器,但是,我将在进程之外进行 kill 调用。 我在这
我正在为应用程序使用 Visualforce Remoting,并定期收到错误: Uncaught TypeError: Cannot read property 'tid' of undefined
我想在Asus_Z008D上构建我的应用程序,但是我有这个问题: [Mono] Could not load file or assembly 'System.Runtime, Version=4.0
我只是遇到了问题。当我将gradle版本更改为2.1.0(旧版本是1.5.0)时,我的代码出错了。而且它没有logcat,所以我只是不知道如何查找问题和错误的零件代码。我试图在我的AndroidMan
我调用内核函数 sched_setaffinity() 以尝试使用 CPU 锁定内核线程,但它总是失败,错误号 22 显示“参数无效”。该机器运行 Fedora 15,内核版本为 2.6.38。 如果
当我记录名为 tid 的键的 json 字符串时,它总是返回 0。请检查以下示例。 var transaction = {tid:1, type:0, time:126312736}; var tra
JVMTI 有一个函数叫做GetAllThreads。但是我们只能得到jthread对象。有什么方法可以获取 jthread 对象的 tid 吗?我所说的 tid 是指由 gettid() 系统调用返
这个问题不是关于 pthread ID,而是关于通常由 gettid 或 ptrace 获取的值。 linux 内核是否提供任何机制以相对有效的方式从给定的 tid 中获取线程组 ID(通常通过 ge
我使用以下内容来获取 drupal 8 中分类术语的父级: $parent = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->l
我的应用程序崩溃,除了出现此错误外,没有任何堆栈跟踪: A/libc: Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 12680
我必须这样做: 编写一个程序,其主线程创建 3 个其他线程。这些线程(不同于主线程)中的每一个都应写入其 pid 和 tid,并终止返回 1 到 3 之间的整数,并且不同于其他线程返回的值。主线程应在
我是一名优秀的程序员,十分优秀!