《Android编程权威指南》之第二个activity源码及挑战

文章目录

  • 前言
  • 效果图
  • 依赖
  • Mainactivity
    • Kotlin的“ ?”
      • kotlin的符号
  • QuizViewModel
  • Question类
  • CheatActivity
    • onBackPressed()
    • companion
  • CheatViewModel
  • string.xml

前言

实现禁止一题多答,按题记录作弊状态、偷看次数限制、横竖屏切换依旧保存状态数据
个人思维的项目分析
在这里插入图片描述

效果图

请添加图片描述
请添加图片描述

依赖

android {
....
  buildFeatures {
        viewBinding true//kotlin数据绑定
    }
}
dependencies {
 	//生命周期
    implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
}

Mainactivity

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityOptionsCompat
import androidx.lifecycle.ViewModelProvider
import com.example.myapplication.databinding.ActivityMainBinding

private const val TAG = "MainActivity"
private const val KEY_INDEX = "index"
const val EXTRA_ANSWER_SHOW = "extra_answer_show"
const val DEFAULT_CAN_CHEAT_NUM: Int = 3
const val KEY_CHEAT_NUM = "cheat_num"

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding

    private val quizViewModel by lazy { ViewModelProvider(this)[QuizViewModel::class.java] }

    /**
     * 当启动一个新的Activity并等待其结果时,如果这个新Activity表明用户可能作弊(通过显示答案),那么就增加用户的作弊次数并更新这个数值
     */
    private val startForResult =
        //启动一个新Activity并等待其结果的函数。
        // ActivityResultContracts.StartActivityForResult()是一个预定义的合约,用于处理StartActivityForResult的请求和结果
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            //检查新Activity的返回结果是否为"OK"的代码。
            // "it"是一个包含Activity结果的Bundle对象。
            // 如果新Activity成功完成(即没有错误),那么它的返回码将是Activity.RESULT_OK
            if (it.resultCode == Activity.RESULT_OK) {
                quizViewModel.isCheater =
                        //尝试从返回的Bundle中获取名为EXTRA_ANSWER_SHOW的布尔值,如果这个值不存在,那么就返回默认值false
                    it.data?.getBooleanExtra(EXTRA_ANSWER_SHOW, false) ?: false
                if (quizViewModel.isCheater) {
                    // 如果偷看了答案
                    quizViewModel.cheatNum++
                    updateCheatNum()
                }
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        if (savedInstanceState != null) {
            quizViewModel.currentIndex = savedInstanceState.getInt(KEY_INDEX, 0)
            quizViewModel.cheatNum = savedInstanceState.getInt(KEY_CHEAT_NUM, 0)
        }
        Log.i(TAG, "onCreate(savedInstanceState: Bundle?) called")

        // 回答问题
        mBinding.trueButton.setOnClickListener { checkAnswer(true) }
        mBinding.falseButton.setOnClickListener { checkAnswer(false) }

        // 下个问题
        mBinding.nextButton.setOnClickListener {
            quizViewModel.moveToNext()
            updateQuestion()
        }

        // 上个问题
        mBinding.preButton.setOnClickListener {
            quizViewModel.moveToPre()
            updateQuestion()
        }

        // 点文字下个问题
        mBinding.questionTextView.setOnClickListener {
            quizViewModel.moveToNext()
            updateQuestion()
        }

        // 偷看答案
        mBinding.btnCheat.setOnClickListener {
            val answer = quizViewModel.currentQuestionAnswer
            val option =
                //创建一个ClipReveal动画
                ActivityOptionsCompat.makeClipRevealAnimation(it, 0, 0, it.width, it.height)
            //启动一个新的Activity。startForResult是一个方法,用于启动一个新的Activity并等待其结果
            startForResult.launch(CheatActivity.newIntent(this, answer), option)
        }

        mBinding.tvResult.setOnClickListener {
            getScoreResult()
        }
        // 更新问题
        updateQuestion()

        //更新查看答案次数
        updateCheatNum()
    }

    /**
     * 更新问题
     */
    private fun updateQuestion() {
        val questionTextResId = quizViewModel.currentQuestionText
        mBinding.questionTextView.setText(questionTextResId)
//如果quizViewModel.mQuestionsAnswered不为null,
//并且其第quizViewModel.currentIndex个元素不为null,则将按钮设置为启用状态(即true),否则设置为禁用状态(即false)
        setBtnEnabled(!quizViewModel.mQuestionsAnswered?.get(quizViewModel.currentIndex)!!)
    }

    private fun updateCheatNum() {
        var canCheatNum = DEFAULT_CAN_CHEAT_NUM - quizViewModel.cheatNum
        mBinding.tvCheatNum.text = "还可以偷看答案 $canCheatNum 次"
        if (canCheatNum == 0) {
            mBinding.btnCheat.isEnabled = false
        }
    }

    /**
     *检测选的答案  里面还需要更新回答正确的题目数,以及已经回答过的题目index
     */
    private fun checkAnswer(userAnswer: Boolean) {
        // 得到当前题目的答案
        val correctAnswer = quizViewModel.currentQuestionAnswer

        val messageResId = when {
            //如果偷看了答案答题
            quizViewModel.isCheater -> R.string.judgment_toast
            //没有作弊答题
            userAnswer == correctAnswer -> {
                // 回答正确的题目数量
                quizViewModel.mTrueAnswerCount++
                R.string.correct_toast
            }

            else ->
                R.string.incorrect_toast
        }
        Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
        setBtnEnabled(false)
        //如果用户已经回答了当前的问题(即在mQuestionsAnswered列表的currentIndex位置已经有值),那么就将这个值设置为true
        quizViewModel.mQuestionsAnswered?.set(quizViewModel.currentIndex, true)
        // 重置一下是否偷看了答案,此题回答过了,一来不可重复回答,二来解决回答下个问题时此参数还是原来的
        quizViewModel.isCheater = false
    }

    //成绩
    private fun getScoreResult() {
        //检查用户是否回答了所有的问题,对于每个问题,如果用户没有回答,就将isAllAnswered设置为false,并立即结束循环。
        // 如果对所有问题用户都已回答(即isAllAnswered保持为true
        var isAllAnswered = true
//        for (i in 0 until quizViewModel.questionSize) {
//            if (!quizViewModel.mQuestionsAnswered?.get(i)!!) {
//                isAllAnswered = false
//                return
//            }
        //       }
        if (isAllAnswered) {
            Toast.makeText(
                this,
                "${quizViewModel.mTrueAnswerCount * 100 / quizViewModel.questionSize}",
                Toast.LENGTH_LONG
            ).show()
            //mBinding.tvResult.text = "评分:${quizViewModel.mTrueAnswerCount * 100 / quizViewModel.questionSize} "
        }
    }

    override fun onStart() {
        super.onStart()
        Log.i(TAG, "onStart() called")
    }

    override fun onResume() {
        super.onResume()
        overridePendingTransition(0, 0);
        Log.i(TAG, "onResume() called")
    }

    override fun onPause() {
        super.onPause()
        Log.i(TAG, "onPause() called")
    }

    override fun onStop() {
        super.onStop()
        Log.i(TAG, "onStop() called")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(TAG, "onDestroy() called")
    }

    //横竖屏切换时调用方法,保存数据,在create中取出
    override fun onSaveInstanceState(savedInstanceState: Bundle) {
        super.onSaveInstanceState(savedInstanceState)
        Log.i(TAG, "onSaveInstanceState")
        savedInstanceState.putInt(KEY_INDEX, quizViewModel.currentIndex)// 当前显示的题目的index
        savedInstanceState.putInt(KEY_CHEAT_NUM, quizViewModel.cheatNum)// 偷看答案次数
    }

    // 禁止一题多答,设置button状态
    private fun setBtnEnabled(enabled: Boolean) {
        mBinding.trueButton.isEnabled = enabled
        mBinding.falseButton.isEnabled = enabled
    }
}

Kotlin的“ ?”

在 Kotlin 中,? 是一个可空类型标记符,用于表示某个变量可以为空(null)。

可以使用 ? 标记来声明一个可空类型的变量,例如:

var nullableString: String? = null

在上面的例子中,我们声明了一个类型为 String? 的变量 nullableString,它可以存储一个字符串或空值(null)。

当我们使用可空类型时,需要注意使用安全调用运算符 ?. 避免空指针异常。

例如,以下代码将仅在 nullableString 不为 null 时打印字符串:

nullableString?.let { println(it) }

还可以使用非空断言运算符 !! 来操作可空类型的变量,但是需要注意,如果该变量为 null,将会触发空指针异常。因此,应该尽量避免使用 !!

总之,在 Kotlin 中,使用 ? 标记符可以确保代码的健壮性,避免空指针异常。

kotlin的符号

在 Kotlin 中,符号 . 用于引用类的成员,例如:

val list = listOf(1, 2, 3)
list.size // 使用 . 符号访问 list 对象的 size 属性
list.get(0) // 等价于 list[0],使用 [] 符号访问 list 对象的成员函数或下标运算符

另外,Kotlin 中还有一些其他的符号:

  • =:用于赋值或复制操作,例如:val b = a。注意,它不同于 Java 中的 == 相等运算符。
  • ?:: Elvis 运算符,用于当一个变量为 null 时提供一个默认值,例如:val result = nullableVariable ?: defaultValue
  • !!:非空断言(Not-null Assertion)运算符,用于断言一个变量不为 null,并强制进行类型转换,例如:val strLength = str!!.length
  • ?:可空类型标记符,用于表示某个变量可以为空(null),例如:var nullableString: String? = null
  • :::引用一个类或函数的引用,例如:val functionRef = :: functionName 表示 functionRef 是一个对 functionName 函数的引用。

以上是 Kotlin 中的一些常用符号,当然,还有其他的一些符号,如Lambda表达式中的->、区间运算符..等,都是 Kotlin 中的基础语法符号,需要深入了解。

QuizViewModel

使用ViewModel,可以把所有要显示在用户界面上的数据汇集在一处,统一格式化加工处理供其他对象获取

import android.util.Log
import androidx.lifecycle.ViewModel
import com.pyn.androidguide.Question

private const val TAG = "QuizViewModel"

class QuizViewModel : ViewModel() {

    // 当前显示的题目的index
    var currentIndex = 0
    // 回答正确的题目数量
    var mTrueAnswerCount = 0
    // 是否偷看了答案
    var isCheater = false
    // 偷看答案次数,默认0
    var cheatNum = 0

    // 题目库
    private val questionBank = listOf(
        Question(R.string.question_australia, true),
        Question(R.string.question_oceans, true),
        Question(R.string.question_mideast, false),
        Question(R.string.question_africa, false),
        Question(R.string.question_americas, true),
        Question(R.string.question_asia, true)
    )

    // 已经回答过的问题
    var mQuestionsAnswered: BooleanArray? = BooleanArray(questionBank.size)

    // 得到当前题目的答案
    val currentQuestionAnswer: Boolean get() = questionBank[currentIndex].answer

    // 得到当前题目文本
    val currentQuestionText: Int get() = questionBank[currentIndex].textResId

    // 得到当前总题目数量
    val questionSize: Int get() = questionBank.size

    // 移动下一个题目
    fun moveToNext() {
        currentIndex = (currentIndex + 1) % questionBank.size
    }

    // 上一个题目
    fun moveToPre(){
        currentIndex = (currentIndex + questionBank.size - 1) % questionBank.size
    }

    // test
    init {
        Log.i(TAG, "ViewModel instance created")
    }

    /**
     * On cleared
     * onCleared()函数的调用恰好在ViewModel被销毁之前。适合做一些善后清理工作,比如解绑某个数据源。
     */
    override fun onCleared() {
        super.onCleared()
        Log.i(TAG, "ViewModel instance about to destroyed")
    }
}

Question类

data class Question(@StringRes val textResId: Int, val answer: Boolean)

data 是一个关键字,用于在类中自动生成一些特殊的方法。当你在类声明中使用 data 关键字时,Kotlin 会自动为这个类生成以下方法:

  1. equals(): 这个方法用于比较两个对象是否相等。在 data 类中,Kotlin 会自动将所有的属性用于 equals() 方法的比较。
  2. hashCode(): 这个方法返回对象的哈希码。在 data 类中,Kotlin 会自动为每个属性计算哈希码,并将其组合以产生最终的哈希码。
  3. toString(): 这个方法返回对象的字符串表示形式。在 data 类中,Kotlin 会自动将所有属性用于 toString() 方法的生成。
  4. Kotlin 还会为 data 类生成一个 copy() 方法,该方法用于创建一个新对象,其属性值与原始对象相同

CheatActivity

import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.example.myapplication.databinding.ActivityCheatBinding

private const val EXTRA_ANSWER = "extra_answer"
private const val IS_SHOW_ANSWER = "is_show_answer"

class CheatActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityCheatBinding
    private var answer = false

    private val cheatViewModel by lazy { ViewModelProvider(this)[CheatViewModel::class.java] }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityCheatBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        if (savedInstanceState != null) {
            cheatViewModel.isShowAnswer = savedInstanceState.getBoolean(IS_SHOW_ANSWER, false)
        }

        answer = intent.getBooleanExtra(EXTRA_ANSWER, false)
        mBinding.btnShowAnswer.setOnClickListener {
            cheatViewModel.isShowAnswer = true
            val answerText = when {
                answer -> R.string.true_button
                else -> R.string.false_button
            }
            mBinding.tvAnswer.setText(answerText)
        }
    }

    // 每次返回的时候,把结果带回去,如果看了答案,则作弊机会-1
    override fun onBackPressed() {
        setAnswerShowResult(cheatViewModel.isShowAnswer)
        super.onBackPressed()
    }

    override fun onSaveInstanceState(savedInstanceState: Bundle) {
        super.onSaveInstanceState(savedInstanceState)
        savedInstanceState.putBoolean(IS_SHOW_ANSWER, cheatViewModel.isShowAnswer)
    }

    /**
     * 给第一个activity返回是否偷看了答案
     */
    fun setAnswerShowResult(isAnswerShown: Boolean) {
        //创建了一个新的Intent对象,并通过apply函数添加了一个额外的数据
        val data = Intent().apply { putExtra(EXTRA_ANSWER_SHOW, isAnswerShown) }
        //将上述创建的Intent设置为这个Activity的返回结果。
        // Activity.RESULT_OK表示这个Activity的执行结果是成功的,而data则是与这个结果相关的数据
        setResult(Activity.RESULT_OK, data)
    }

    companion object {
        fun newIntent(packageContext: Context, answerIsTrue: Boolean): Intent {
            //Intent被初始化为以CheatActivity类作为目标(即这个Intent将被用来启动CheatActivity)。
            // apply是一个Kotlin函数,它允许在一个对象上执行一系列操作
            return Intent(packageContext, CheatActivity::class.java).apply {
                //使用putExtra方法将一个名为EXTRA_ANSWER_IS_TRUE的键和对应的值(即answerIsTrue)添加到Intent中
                putExtra(IS_SHOW_ANSWER, answerIsTrue)
            }
        }
    }
}

onBackPressed()

onBackPressed()方法是Android中的一个方法,用于处理用户按下设备上的“返回”按钮时的操作。当用户按下“返回”按钮时,系统会自动调用此方法。onBackPressed()方法通常被覆盖,以提供自定义的返回行为。例如,您可以使用onBackPressed()方法来关闭一个活动或片段,或在退出应用程序之前显示确认对话框。

companion

在Kotlin中,每个类都可以包含一个称为伴生对象的对象。关键字“companion”用于定义伴生对象。伴生对象类似于Java中的静态方法和变量。
伴生对象在类的内部定义,但是它的成员可以直接访问类的私有成员。它们还可以访问其伴生对象的私有成员。
伴生对象的使用如下:

class MyClass {
    // 外部无法访问,只能在该类的成员内部访问的属性或方法
    private val myPrivateVar = 10

    companion object {
        // 外部可直接访问该属性
        val myPublicVar = 20

        // 外部可通过该方法访问该类的私有成员
        fun accessPrivateVar() = MyClass().myPrivateVar
    }
}

在上面的示例中,我们定义了一个名为“MyClass”的类和一个伴生对象。在伴生对象中,我们定义了一个名为“myPublicVar”的公共属性,它可以直接从类外部访问。我们还定义了一个名为“accessPrivateVar”的公共方法,它可以从类的外部访问该类的私有成员“myPrivateVar”。

伴生对象与类相关联,因此它们可以像类一样调用,例如:

val myVar = MyClass.myPublicVar       // 直接访问伴生对象的公共属性
val myPrivateVar = MyClass.accessPrivateVar()     // 通过伴生对象访问类的私有成员

CheatViewModel

import androidx.lifecycle.ViewModel

class CheatViewModel : ViewModel() {
    // 是否偷看了答案
    var isShowAnswer = false
}

string.xml

<resources>
    <string name="app_name">MyApplication</string>
    <string name="true_button">正确</string>
    <string name="false_button">错误</string>
    <string name="next_button">下一题</string>
    <string name="pre_button">PRE</string>

    <string name="correct_toast">答对了</string>
    <string name="incorrect_toast">答错了!</string>

    <string name="warning_text">你确定吗</string>
    <string name="show_answer_button">显示答案</string>
    <string name="cheat_button">作弊</string>
    <string name="judgment_toast">作弊不对</string>

    <string name="question_australia">1、Canberra is the capital of Australia.</string>
    <string name="question_oceans">2、The Pacific Ocean is larger than the Atlantic Ocean.</string>
    <string name="question_mideast">3、The Suez Canal connects the Red Sea and the Indian Ocean.</string>
    <string name="question_africa">4、The source of the Nile River is in Egypt.</string>
    <string name="question_americas">5、The Amazon River is the longest river in the Americas.</string>
    <string name="question_asia">6、Lake Baikal is the world\'s oldest and deepest freshwater lake.</string>

</resources>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/229436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GeoPandas初体验:它是什么,我用它展示一下shp矢量数据

GeoPandas 是一个开源的 Python 库&#xff0c;用于处理地理空间数据。它扩展了 Pandas 这个流行的 Python 数据操作库&#xff0c;增加了对地理数据类型和操作的支持。GeoPandas 结合了 Pandas、Matplotlib 和 Shapely 的功能&#xff0c;提供了一个易于使用且高效的工具&…

“我要报名”参观双十二外贸电商节,报名方式都在这!

双十二外贸电商节深圳进出口贸易博览会 2023年12月11-12日 深圳福田会展中心 近1万方展览面积 30000专业观众 跨境选品 外贸采购 行业趋势 人才对接 ▼▼▼▼ 展会时间 2023年12月11日-12日 展会地点 深圳福田会展中心 双十二外贸电商节暨2023深圳进出口贸易博览会选…

【SpringCache】快速入门 通俗易懂

1. 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; EHCache Caffeine Redis(常用…

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎&#xff0c;利用操作系统本身已有的机制和特性&#xff0c;可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…

Python 日志指南

目录 日志指南 日志基础教程 什么时候使用日志 一个简单的例子 记录日志到文件 从多个模块记录日志 记录变量数据 更改显示消息的格式 在消息中显示日期/时间 后续步骤 进阶日志教程 记录流程 记录器 处理器 格式器 配置日志记录 如果没有提供配置会发生什么 …

python-04(入门基础篇4——lists相关的部分语法)

python-04&#xff08;入门基础篇4——lists相关的部分语法&#xff09; 1. 前言1.1 python入门1.2 参考官网 2. 关于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新项 4. 列表是可变类型4.1 更改其中某元素内容4.2 使用切片更改列表大小…

数据结构与算法(六)分支限界法(Java)

目录 一、简介1.1 定义1.2 知识回顾1.3 两种解空间树1.4 三种分支限界法1.5 回溯法与分支线定法对比1.6 使用步骤 二、经典示例&#xff1a;0-1背包问题2.1 题目2.2 分析1&#xff09;暴力枚举2&#xff09;分支限界法 2.3 代码实现1&#xff09;实现广度优先策略遍历2&#xf…

视频批量剪辑方法:AI智剪创新力,批量剪辑新风潮

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为日常生活和工作中不可或缺的一部分。然而&#xff0c;对于许多非专业人士来说&#xff0c;视频剪辑仍然是一个相对繁琐和复杂的过程。AI智剪是一种基于人工智能技术的视频批量剪辑方法。它可以通过自动化和智能化的方式…

用23种设计模式打造一个cocos creator的游戏框架----(五)工厂方法模式

1、模式标准 模式名称&#xff1a;工厂方法模式 模式分类&#xff1a;创建型 模式意图&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 结构图&#xff1a; 适用于&#xff1a; 1、当一个类不知道它…

安装以及使用Minio分布式文件系统

简介 MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 它一大特点就是轻量&#xff0c;使用…

循环单向链表与约瑟夫问题

循环链表介绍 先不急着看约瑟夫问题是什么&#xff0c;先了解循环链表的结构&#xff0c;那什么是循环链表&#xff1f; 循环&#xff0c;顾名思义&#xff0c;从链表中第一个节点出发&#xff0c;还会遇到第一个节点&#xff0c;形成循环的一环。也就是说链表中最后一个节点…

春晚回应吉祥物“龙辰辰”被质疑 AI 合成;周星驰 Web3 团队下月上线独立 App 丨 RTE 开发者日报 Vol.102

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Python基础知识-变量、数据类型(整型、浮点型、字符类型、布尔类型)详解

1、基本的输出和计算表达式&#xff1a; prinit(12-3) printf(12*3) printf(12/3) prinit(12-3) printf(12*3) printf(12/3) 形如12-3称为表达式 这个表达式的运算结果称为 表达式的返回值 1 2 3 这样的数字&#xff0c;叫做 字面值常量 - * /称为 运算符或者操作符 在C和j…

【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误

目录 1 Error错误提示 2 Error错误原因 3 如何消除Error错误 结尾 【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error错误提示 使用S32DSJ-LinK下载程序&#xff0c;在Dedug Configurati…

TA-Lib学习研究笔记(九)——Pattern Recognition (2)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;2&#xff09; 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是open, hig…

H5ke14--1--拖放

介绍drag,drop 一.被拖动元素,目标(释放区) 元素要设置dragable属性:true,false,auto 被拖动元素上面有三个事件,drag,dragend,按下左键,移动种,鼠标松,这三个事件一般只用获取我们的被拖动元素 冒泡:event是可以继承的,mouseevent鼠标事件,dragevent拖放事件,前面都是一个…

大数据技术1:大数据发展简史

前言&#xff1a;学习大数据技术&#xff0c;知道会用已经够了&#xff0c;但是要想走得更远&#xff0c;应该了解它发展的来龙去脉&#xff0c;为何会有新的技术/工具的出现&#xff0c;相比老的技术有什么样的进步。 1、传统数据处理系统存在的问题 随着信息时代互联网技术爆…

Efficient physics-informed neural networks using hash encoding

论文阅读&#xff1a;Efficient physics-informed neural networks using hash encoding Efficient physics-informed neural networks using hash encoding简介方法PINN哈希编码具有哈希编码的 PINN 实验Burgers 方程Helmholtz 方程N-S 方程训练效率对比 总结 Efficient physi…

Java来实现二叉树算法,将一个二叉树左右倒置(左右孩子节点互换)

文章目录 二叉树算法二叉树左右变换数据 今天来和大家谈谈常用的二叉树算法 二叉树算法 二叉树左右变换数据 举个例子&#xff1a; Java来实现二叉树算法&#xff0c;将一个二叉树左右倒置&#xff08;左右孩子节点互换&#xff09;如下图所示 实现的代码如下&#xff1a;以…

AntDB数据库助力中国移动结算中心建设

结算中心负责中国移动漫游伙伴进行数据和财务清算支撑。本次结算中心项目涉及结算处理、资料管理、信息管理等模块&#xff0c;用以构建系统的结算能力。 建设需求 结算中心现有传统集中式架构的数据库无法做到根据业务量变化进行弹性扩缩容&#xff0c;目前系统数据量巨大&a…