当前位置: 首页 > news >正文

学习Android的第二十八天

目录

Android Service (服务)

线程

Service (服务)

Service 相关方法

Android 非绑定 Service

startService() 启动 Service

验证 startService() 启动 Service 的调用顺序

Android 绑定 Service

bindService() 启动 Service

验证 BindService 启动 Service 的顺序

startService() 启动 Service 后 bindService() 绑定

Android IntentService 耗时操作

IntentService

范例


Android Service (服务)

在 Android 中,Service 主要用于在后台执行长时间运行的操作,并且提供了与其他组件交互的机制。Service 和 Thread 有一些相似之处,但也存在着明显的区别。 Thread  在应用程序的进程内创建的轻量级执行单元。一个进程可以有多个线程,它们共享相同的内存空间和资源,是 Java 中用于实现并发的基本单位。

线程

我们先来看看 Thread (线程) 有关的一些概念:

  1. 程序(Program):指的是为了完成特定任务而用某种编程语言编写的一组指令集合,通常是静态的代码文件。
  2. 进程(Process):是操作系统中的一个独立执行单位,运行中的程序。每个进程都有独立的内存空间,操作系统为每个进程分配一段内存空间,用于存储程序的代码、数据以及运行时的状态信息。进程是操作系统进行资源分配和调度的基本单位,一个进程可以包含多个线程。
  3. 线程(Thread):是比进程更小的执行单元,是程序执行流的最小单元。一个进程中可以有多个线程,它们共享相同的内存空间和资源,但拥有各自的执行路径。线程由程序负责管理,而进程则由操作系统进行调度。
  4. 多线程的理解:多线程是指在一个程序中同时执行多个线程,每个线程都独立运行,并且可能同时访问共享的内存空间。虽然在单核处理器上实际上是分时执行的,但由于线程切换的速度非常快,用户会感觉到线程是同时执行的。
  5. 线程的生命周期:线程的生命周期包括创建、就绪、运行、阻塞和销毁等状态。线程的状态会随着执行过程中的不同操作而发生变化。

关于创建线程的方式,有三种常见的方法:

  • 继承 Thread 类:定义一个类继承自 Thread,并重写其 run() 方法来定义线程执行的任务。
  • 实现 Runnable 接口:定义一个类实现 Runnable 接口,并实现其 run() 方法,然后将该类的实例传递给 Thread 的构造方法。
  • 实现 Callable 接口:定义一个类实现 Callable 接口,并实现其 call() 方法,然后将该类的实例传递给 ExecutorService 的 submit() 方法。

在 Android 开发中,通常推荐使用第二种方式,即实现 Runnable 接口来创建线程。常见的做法是通过创建一个 Runnable 对象,并将其传递给 Thread 类的构造方法来创建新的线程。另外,也可以使用匿名类的方式来创建线程,这在 Android 开发中更为常见。

Service (服务)

在 Android 中,Service 是一种用于执行长时间运行操作的组件,可以在后台执行任务而不需要用户界面。Service 的生命周期包括以下方法:

1.onCreate():当 Service 第一次创建时调用。在此方法中,通常进行一次性的初始化操作,例如创建线程、初始化变量等。

2. onStartCommand(Intent, int, int):当通过 startService() 方法启动 Service 时调用。在此方法中,Service 可以处理启动请求并执行相应的操作。该方法会返回一个整数值,用于指示系统在 Service 终止后是否应该尝试重新启动该 Service。

3. onBind(Intent):当通过 bindService() 方法启动 Service 时调用。在此方法中,Service 返回一个 IBinder 对象,允许客户端与 Service 进行通信。如果不想允许绑定,则可以返回 null。

4. onUnbind(Intent):当所有客户端与 Service 解绑时调用。在此方法中,通常执行一些资源清理或其他必要的操作。

5. onDestroy():当 Service 即将销毁时调用。在此方法中,通常释放资源、停止线程等清理工作。

Android 中使用 Service 的方式有两种:

1. startService():通过调用 Context 的 startService() 方法来启动 Service。调用此方法后,Service 将会在后台运行,即使启动它的组件已经销毁。通常用于执行一次性任务,例如下载文件、播放音乐等。

2. bindService():通过调用 Context 的 bindService() 方法来绑定 Service。绑定 Service 后,客户端可以与 Service 进行通信,直到所有客户端解绑。通常用于需要与 Service 进行交互的场景,例如绑定到音乐播放器 Service 并控制播放状态。

这两种方式可以结合使用,例如通过 bindService() 方法绑定到 Service 并获取其实例,然后再调用其方法执行任务。

Service 相关方法

1、onCreate():

  • 说明:当 Service 第一次被创建后立即回调该方法。该方法在整个生命周期中只会调用一次。
  • 用途:通常在这个方法中进行一次性的初始化操作,比如创建线程、初始化变量等。

2、onDestroy():

  • 说明:当 Service 被关闭时会回调该方法。该方法只会在 Service 被销毁时调用一次。
  • 用途:通常在这个方法中执行一些清理工作,释放资源、停止线程等。

3、onStartCommand(intent, flag, startId)(在早期版本是 onStart(intent, startId)):

  • 说明:当客户端调用 startService(Intent) 方法时会回调。可多次调用 startService() 方法,但不会再创建新的 Service 对象,而是继续复用前面产生的 Service 对象,会继续回调onStartCommand() 方法。
  • 用途:用于处理客户端对 Service 的启动请求,执行相应的操作。方法的参数包括 Intent 对象(携带启动服务的请求信息)、flag(标志位)和 startId(启动命令的唯一标识)。

4、onBind(intent):

  • 说明:Service 必须实现的方法,该方法会返回一个 IBinder 对象,应用程序通过该对象与 Service 组件进行通信。
  • 用途:用于实现与客户端绑定的通信接口,返回的 IBinder 对象用于客户端与 Service 进行通信。

5、onUnbind(intent):

  • 说明:Service 上绑定的所有客户端都断开连接时会回调该方法。
  • 用途:通常在这个方法中执行一些资源清理或其他必要的操作。

Android 非绑定 Service

startService() 启动 Service

startService() 方法用于启动一个 Service。第一次启动 Service 时,会创建一个新的 Service 实例,并按顺序调用 onCreate() 和 onStartCommand() 方法。

一旦 Service 进入运行状态,再次调用 startService() 时,不会创建新的 Service 实例,而是系统会直接复用之前创建的 Service 实例,并调用其 onStartCommand() 方法。

这种 Service 与其调用者之间没有必然的联系,即使调用者的生命周期结束了,只要没有调用 stopService() 方法,Service 仍然会继续运行。

不论调用了多少次 startService(),只需调用一次 stopService() 就可以停止 Service 的运行。

验证 startService() 启动 Service 的调用顺序

1、MyService.java:

package com.example.myapplication2;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;public class MyService extends Service {private static final String TAG = "MyService";@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "onCreate()已调用");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "使用startId调用onStartCommand(): " + startId);return START_STICKY;}@Overridepublic IBinder onBind(Intent intent) {// 不是绑定式服务,返回 nullreturn null;}
}

2、MainActivity.java:

package com.example.myapplication2;import android.os.Bundle;
import android.content.Intent;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, "正在启动MyService。。。");Intent serviceIntent = new Intent(this, MyService.class);startService(serviceIntent);}
}

3、确保在 AndroidManifest.xml 文件中注册了 MyService:

<service android:name=".MyService"/>

4、运行效果如下

Android 绑定 Service

bindService() 启动 Service

bindService(Intent Service,ServiceConnection conn,int flags)

bindService() 方法是用于在 Android 应用程序中绑定服务的方法。下面是对参数的解释:

  • service:通过这个 Intent 参数指定要启动的服务。Intent 中包含了服务的标识符和其他必要的信息。
  • conn:ServiceConnection 对象,用于监听访问者与服务之间的连接情况。当连接成功时,会回调该对象中的 onServiceConnected(ComponentName, IBinder) 方法。当服务由于异常终止或其他原因与访问者断开连接时,会调用 onServiceDisconnected(ComponentName) 方法。需要注意的是,主动通过 unBindService() 方法断开连接并不会调用 onServiceDisconnected() 方法。
  • flags:指定绑定时是否自动创建服务。可以使用以下两个常量之一:0(不自动创建)或 BIND_AUTO_CREATE(自动创建)。如果服务还未创建且设置为自动创建,则在绑定时会自动创建服务。

通过调用 bindService() 方法,应用程序可以与服务建立连接,并通过 ServiceConnection 监听连接状态的变化。这样可以实现应用程序与服务之间的交互和通信。

注意:

  • 使用 bindService() 方法来启动服务,并通过参数传递要启动的服务以及一个 ServiceConnection 对象,用于监听连接情况。
  • 在 ServiceConnection 对象中,可以通过 onServiceConnected() 方法来处理与服务连接成功的情况,并在其中获取 IBinder 对象,以实现与服务之间的通信。
  • 如果服务所在的宿主异常终止或其他原因终止,会调用 onServiceDisconnected() 方法。
  • 解除与服务的绑定可以通过调用 unbindService() 方法来实现,此时会调用服务的 onUnbind() 和 onDestroy() 方法。
  • 多个客户端绑定同一个服务时,当所有客户端都解除绑定后,系统会销毁服务,除非服务也被 startService() 方法启动。
  • 在自定义服务中,一般需要继承 Binder 类并实现自己的 IBinder 对象,并在 onBind() 方法中返回该对象。

综上所述,通过绑定服务,应用程序能够与服务之间建立更为紧密的连接,并进行双向通信。

验证 BindService 启动 Service 的顺序

1、MainActivity.java:

package com.example.myapplication2;import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private TimerService timerService;private boolean isBound = false;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {TimerService.TimerBinder binder = (TimerService.TimerBinder) service;timerService = binder.getService();isBound = true;Log.d(TAG, "onServiceConnected:TimerService已连接");}@Overridepublic void onServiceDisconnected(ComponentName name) {isBound = false;Log.d(TAG, "onServiceDisconnected:TimerService已断开连接");}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 启动并绑定服务Intent intent = new Intent(this, TimerService.class);bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);}@Overrideprotected void onDestroy() {super.onDestroy();if (isBound) {unbindService(serviceConnection);isBound = false;}}
}

2、MyService.java:

package com.example.myapplication2;import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class TimerService extends Service {private static final String TAG = "TimerService";private final IBinder binder = new TimerBinder();private boolean isRunning = false;public class TimerBinder extends Binder {TimerService getService() {return TimerService.this;}}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "onBind:TimerService绑定");return binder;}@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "onCreate:TimerService已创建");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "StartCommand:TimerService已启动");return START_NOT_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy:TimerService已销毁");}// 启动计时器的方法public void startTimer() {Log.d(TAG, "StartTimer:计时器已启动");isRunning = true;}// 停止计时器的方法public void stopTimer() {Log.d(TAG, "stopTimer:计时器已停止");isRunning = false;}
}

3、确保在 AndroidManifest.xml 文件中注册了 TimerService:

<service android:name=".TimerService"/>

startService() 启动 Service 后 bindService() 绑定

当一个服务已经通过 startService() 方法启动后,即使有其他客户端通过 bindService() 方法绑定到该服务,服务仍然会保持运行状态,直到所有客户端都调用了 unbindService() 方法来解除绑定,并且没有其他客户端通过 startService() 方法启动了该服务,才会触发服务的销毁。

在这种情况下,如果调用 bindService() 来绑定到一个已经启动的服务,系统只是将服务的内部 IBinder 对象传递给客户端,不会将服务的生命周期与客户端绑定。因此,即使客户端调用 unbindService() 方法解除绑定,服务也不会被销毁。

总结起来,对于已经通过 startService() 启动的服务,即使有其他客户端通过 bindService() 方法绑定到该服务,服务也只有在所有客户端都调用了 unbindService() 方法解除绑定,并且没有其他客户端通过 startService() 方法启动了该服务时才会被销毁。

Android IntentService 耗时操作

IntentService

IntentService 是 Android 平台提供的一种服务,用于处理异步请求。它是 Service 类的一个子类,但相比普通的 Service,IntentService 更适合用来执行需要较长时间的操作,而且它可以在后台自动停止,无需手动控制。

下面是 IntentService 的一般用法:

  1. 启动 IntentService:客户端通过调用 startService(Intent) 方法来启动 IntentService。这个 Intent 包含了要执行的操作的描述。
  2. 自动停止:IntentService 在执行完所有的请求后会自动停止。这意味着我们不需要手动去停止 IntentService。
  3. 多次启动:IntentService 可以被启动多次。每次启动时,请求的 Intent 会被加入到工作队列中,然后按照队列顺序依次执行。注意,虽然可以多次启动 IntentService,但是每次只会执行一个工作线程,确保操作的顺序性和线程安全性。
  4. onHandleIntent() 回调方法:每个请求的操作会在 IntentService 的 onHandleIntent(Intent) 回调方法中执行。这个方法在工作线程中执行,因此可以执行耗时操作,而不会阻塞主线程。

通过这些特性,IntentService 提供了一种方便的方式来处理异步操作,尤其适合那些需要按顺序执行的任务或者需要在后台执行的长时间操作。

范例

1、MyIntentService.java

package com.example.myapplication2;import android.app.IntentService;
import android.content.Intent;
import android.util.Log;public class MyIntentService extends IntentService {private static final String TAG = "MyIntentService";public MyIntentService() {super("MyIntentService");}@Overrideprotected void onHandleIntent(Intent intent) {// 打印一些日志for (int i = 0; i < 5; i++) {Log.d(TAG, "正在执行任务 " + i);try {// 模拟耗时操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}// 任务完成后,IntentService 会自动停止}
}

2、确保在 AndroidManifest.xml 文件中注册了 MyIntentService:

<serviceandroid:name=".MyIntentService"android:exported="false" />

3、接下来,在应用中启动这个 IntentService:

package com.example.myapplication2;import android.content.Intent;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, MyIntentService.class);startService(intent);}
}

相关文章:

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …...

C++等级3题

鸡兔同笼 #include<bits/stdc.h> using namespace std; void f(int n); int n; int main() {cin>>n;int x0;int ma-1;int mi1000;for(int i0;i<n;i){for(int j0;j<n;j){if(i*2j*4n){x1;mamax(ma,ij);mimin(mi,ij);}}}if(x1){cout<<mi<<" &…...

python中列表常用函数

列表list相关函数 列表相关函数 列表相关函数 汇总&#xff1a;. 列表: 1.list() 方法用于将序列&#xff08;元组&#xff0c;集合&#xff0c;字符串等&#xff09;转换为列表。 用法&#xff1a;list( seq ) #seq为序列&#xff1a;元组 集合 字符串等 2.列表定义&a…...

小程序连接蓝牙

小程序 蓝牙功能 1.授予蓝牙权限2.蓝牙初始化3.监听寻找新设备4.搜索新设备5.建立连接⭐⭐⭐⭐⭐⭐⭐6.监听蓝牙低功耗连接状态改变事件8.监听特征值变化9.发送数据 1.授予蓝牙权限 //1.蓝牙授权 const authBlue (callback, initApp) > {app initApp;//鉴定是否授权蓝牙w…...

基于Python的pygame库的五子棋游戏

安装pygame pip install pygame五子棋游戏代码 """五子棋之人机对战"""import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from collections import namedtupleChessman namedtuple(Chessman, Name…...

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…...

TimescaleDB 开源时序数据库

文章目录 1.TimescaleDB介绍2.Hypertable 和 chunk3.Hypertable4.Hypertable操作 开源中间件 # TimescaleDBhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/timescale/timescale-summary/1.TimescaleDB介绍 TimescaleDB是基于PostgreSQL数据…...

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…...

css3常见选择器

使用工具 Visual Studio Code 1.CSS3基础选择器 1.1 标签选择器 1.2.1 标签选择器的语法 一个完整的HTML5页面是由很多不同的标签组成的&#xff0c;而标签选择器则决定标签应采用的CSS样式&#xff0c;语法如下:标签名{ 属性1&#xff1a;属性值1&#xff1b; 属性2&…...

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…...

2024年华为HCIA-DATACOM新增题库(H12-811)

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…...

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…...

2024-03-14学习笔记(YoloV9)

1.认知越高的人&#xff0c;越敬畏因果 摘要&#xff1a;本文讲述了认知越高的人越敬畏因果的道理。通过故事和名人案例&#xff0c;阐述了敬畏因果对于个人成长和成功的重要性。文章强调了遵循规律、不走捷径、正向思维的重要性&#xff0c;以及思维、行动、习惯、性格和命运…...

Cookie和Session介绍

1、Cookie的一些重要结论&#xff08;令牌&#xff0c;类似就诊卡记住我们的信息&#xff09;&#xff1a; &#xff08;1&#xff09;Cookie从哪里来&#xff1a;服务器返回给浏览器的&#xff0c;通常是首次访问/登录成功之后&#xff08;cookie是在header中传输&#xff09…...

OpenCV 将rgb图像转化成字符图像

将RGB图像转换成字符图像&#xff08;ASCII art&#xff09;通常涉及到灰度化、降采样、映射字符等一系列步骤。以下是一个简化的OpenCVC实现示例&#xff1a; #include <opencv2/opencv.hpp> #include <iostream> #include <string>// 字符映射表&#xff…...

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…...

软件实际应用实例,物流打印用什么软件,佳易王物流货运快运单打印查询管理系统软件,可以在已经印刷好的单子上打印,也可直接打印

软件实际应用实例&#xff0c;物流打印用什么软件&#xff0c;佳易王物流货运快运单打印查询管理系统软件&#xff0c;可以在已经印刷好的单子上打印&#xff0c;也可直接打印 一、前言 以下软件教程以 佳易王物流单打印查询管理系统软件V17.0为例说明 软件文件下载可以点击…...

第六届上海国际垃圾焚烧发电展将于12月11-13日上海举办

第六届上海国际垃圾焚烧发电暨固废处理技术展览会 2024年12月11-13日 上海新国际博览中心 主办单位&#xff1a;中华环保联合会 废弃物发电专委会 支持单位&#xff1a;垃圾焚烧技术与装备国家工程实验室 承办单位&#xff1a;上海怡涵展览服务有限公司 展会介绍&#xff1a…...

pytorch(十)循环神经网络

文章目录 卷积神经网络与循环神经网络的区别RNN cell结构构造RNN例子 seq2seq 卷积神经网络与循环神经网络的区别 卷积神经网络&#xff1a;在卷积神经网络中&#xff0c;全连接层的参数占比是最多的。 卷积神经网络主要用语处理图像、语音等空间数据&#xff0c;它的特点是局部…...

【黑马程序员】Python文件、异常、模块、包

文章目录 文件操作文件编码什么是编码为什么要使用编码 文件的读取openmodel常用的三种基础访问模式读操作相关方法 文件的写入注意代码示例 异常定义异常捕获捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常的传递 python 模块定义模块的导入import模块名from …...

导入fetch_california_housing 加州房价数据集报错解决(HTTPError: HTTP Error 403: Forbidden)

报错 HTTPError Traceback (most recent call last) Cell In[3], line 52 from sklearn.datasets import fetch_california_housing3 from sklearn.model_selection import train_test_split ----> 5 X, Y fetch_california_housing(retu…...

后勤管理系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的后勤管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 员工注册、员工登录 个人中心 公寓信息 员工功能模块 员工积分管理 管理员登录 ​编辑管理员功能模块 个人信息 ​编辑员工管理 公寓户型管理 ​编辑公寓信息管理 系统结构设计 数据库设计 luwen参考 概述 源码获取 文末获取源…...

【办公类-40-01】20240311 用Python将MP4转MP3提取音频 (家长会系列一)

作品展示&#xff1a; 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;除了大量照片视频&#xff0c;还需要一个时间很长的背景音乐MP3 一、下载“歌曲串烧” 装一个IDM 下载三个“串烧音乐MP4”。 代码展示 家长会背景音乐: 歌曲串…...

人类的谋算与量子计算

量子计算并不等价于并行计算。量子计算和并行计算是两种不同的计算模型。 在经典计算中&#xff0c;通过增加计算机的处理器核心和内存等资源&#xff0c;可以实现并行计算&#xff0c;即多个任务同时进行。并行计算可以显著提高计算速度&#xff0c;尤其是对于可以被细分为多个…...

【数据结构和算法初阶(C语言)】栈的概念和实现(后进先出---后来者居上的神奇线性结构带来的惊喜体验)

目录 1.栈 1.1栈的概念及结构 2.栈的实现 3.栈结构对数据的处理方式 3.1对栈进行初始化 3.2 从栈顶添加元素 3.3 打印栈元素 3.4移除栈顶元素 3.5获取栈顶元素 3.6获取栈中的有效个数 3.7 判断链表是否为空 3.9 销毁栈空间 4.结语及整个源码 1.栈 1.1栈的概念及结构 栈&am…...

搭建mysql主从复制(主主复制)

1&#xff1a;设主库允许远程连接(注意&#xff1a;设置账号密码必须使用的插件是mysql_native_password&#xff0c;其他的会连接失败) #切换到mysql这个数据库&#xff0c;修改user表中的host&#xff0c;使其可以实现远程连接 mysql>use mysql; mysql>update user se…...

centos 系统 yum 无法安装(换国内镜像地下)

centos 系统 yum 因为无法连接到国外的官网而无法安装&#xff0c;问题如下图&#xff1a; 更换阿里镜像&#xff0c;配置文件路径&#xff1a;/etc/yum.repos.d/CentOS-Base.repo&#xff08;如果目录有多余的文件可以移动到子目录&#xff0c;以免造成影响&#xff09; bas…...

【python绘图】turle 绘图基本案例

文章目录 0. 基础知识1. 蟒蛇绘制2. 正方形绘制3. 六边形绘制4. 叠边形绘制5. 风轮绘制 0. 基础知识 资料来自中国mooc北京理工大学python课程 1. 蟒蛇绘制 import turtle turtle.setup(650, 350, 200, 200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pen…...

损失函数和反向传播

1. 损失函数的基础 import torch from torch.nn import L1Loss from torch import nninputs torch.tensor([1, 2, 3], dtypetorch.float32) targets torch.tensor([1, 2, 5], dtypetorch.float32)inputs torch.reshape(inputs, (1, 1, 1, 3)) targets torch.reshape(targe…...