【移动端开发】“明日头条APP”

文章目录

  • 1 系统概述
    • 1.1研究背景
    • 1.2研究意义
  • 2 系统设计
    • 2.1 关键技术
    • 2.2 系统设计
      • 2.2.1 系统功能模块
      • 2.2.2 数据库设计
  • 3 系统实现
    • 3.1 数据模型
      • 3.1.1 NewsURL
      • 3.1.2 NewsType
      • 3.1.3 NewsInfo
    • 3.2 数据库操作
      • 3.2.1 DBOpenHelper
      • 3.2.2 DBManager
    • 3.3 适配器类
      • 3.3.1 AddItem
      • 3.3.2 InfoItem
      • 3.3.3 NewsInfo
    • 3.4 Activity模块
      • 3.4.1 MainActivity
      • 3.4.2 DescActivity
      • 3.4.3 AddItemActivity
      • 3.4.4 配置类UniteApp
    • 3.5 程序运行总体思路
  • 4 系统测试
  • 5 设计总结

1 系统概述

1.1研究背景

随着移动互联网的快速发展,智能手机已经成为人们获取信息的主要工具之一。新闻作为信息的重要组成部分,其传播方式和获取途径也发生了显著变化。传统的纸质媒体逐渐被网络媒体所取代,用户能够通过各种应用程序实时获取最新的新闻动态。 在这种背景下,各类新闻客户端应运而生,它们提供了便捷的新闻获取渠道。然而,众多新闻客户端在内容、形式和用户体验上各有差异,如何设计一款功能完善、易于操作且能满足用户需求的新闻客户端APP,成为了一个值得研究的课题。本课程设计旨在通过分析现有新闻客户端的特点,结合网络爬虫技术,实现一款基于Android平台的新闻客户端APP,以解决用户在获取新闻时的信息碎片化问题,提高新闻信息的获取效率。

1.2研究意义

通过使用网络爬虫技术,能够有效地获取和整合来自不同新闻源的信息,将原本分散的新闻内容进行归纳和分类。这一过程不仅提升了对数据处理能力的认识,也为学习和掌握现代计算机科学中的数据挖掘和信息检索等技术提供了机会。 随着社会信息的高速传播,大量用户需要一个集成化的新闻平台以便于获取即时信息。本项目的实现可以帮助用户更方便地浏览新闻、获取知识、拓宽视野,并为开发者创造新的市场机会,提升其在新闻行业的竞争力。 新闻是推动社会进步的重要力量,一个优秀的新闻客户端不仅能够提高公众获取信息的效率,还有助于提升公民的新闻素养和社会责任感。在信息爆炸的时代,为用户提供准确、及时、有价值的新闻信息,有助于构建良好的社会舆论环境,促进社会的和谐发展。

2 系统设计

2.1 关键技术

在这里插入图片描述

2.2 系统设计

2.2.1 系统功能模块

在这里插入图片描述

模块功能说明

在这里插入图片描述

2.2.2 数据库设计

在这里插入图片描述

3 系统实现

3.1 数据模型

3.1.1 NewsURL

管理和构建不同类型新闻的 API 请求 URL

public class NewsURL {
// 用于存储访问新闻 API 所需的 APP KEY
public static String key = "065405525167d8e51990614a378fe7af";  // api - key
public static String info_url = "http://v.juhe.cn/toutiao/index?key="+ key + "&type=";
// 头条
public static String headline_url = info_url + "top";
// 社会
public static String society_url = info_url + "shehui";
}

3.1.2 NewsType

封装与新闻类型相关的信息, 实现了 Serializable 接口以便于在对象序列化时使用, 比如在 Android 中通过 Intent 传递数据。提供了静态方法来获取所有新闻类型的集合,用于后续填充 UI 元素。

public class TypeBean implements Serializable{private int id;private String title;private String url;private boolean isShow;public static List<TypeBean> getTypeList(){List<TypeBean> mDatas = new ArrayList<>();TypeBean tb1 = new TypeBean(1, "头条", NewsURL.headline_url, true);TypeBean tb2 = new TypeBean(2, "社会", NewsURL.society_url, true);mDatas.add(tb1);mDatas.add(tb2);return mDatas;}
}

3.1.3 NewsInfo

封装从新闻 API 返回的新闻信息,使用嵌套类结构来组织数据。根据API获取到的JSON格式数据编写代码。爬虫获得的JSON数据如下:

{"reason": "success!","result": {"stat": "1","data": [{"uniquekey": "564cdaad64ae35f817f92c83d7874753","title": "开展“净网2024”专项行动 厦门警方侦破一起广告推广型网络黑灰产犯罪案","date": "2024-09-18 13:57:00","category": "头条","author_name": "人民网,供稿:人民资讯","url": "https://mini.eastday.com/mobile/240918135748337907540.html","thumbnail_pic_s": "","is_content": "1"}],"page": "1","pageSize": "30"},"error_code": 0
}

新闻信息封装类:

public class InfoBean {private String reason;private ResultBean result;private int error_code;public static class ResultBean {private String stat;private List<DataBean> data;public static class DataBean {private String uniquekey;private String title;private String date;private String category;private String author_name;private String url;private String thumbnail_pic_s;private String thumbnail_pic_s02;private String thumbnail_pic_s03;}}
}

3.2 数据库操作

3.2.1 DBOpenHelper

DBOpenHelper是用于创建和管理 SQLite 数据库的子类,负责创建和初始化 SQLite 数据库,定义表结构和插入初始数据。在数据库版本升级时进行表结构更新或数据迁移。

// 创建和管理 SQLite 数据库的子类
public class DBOpenHelper extends SQLiteOpenHelper{public DBOpenHelper(Context context) {// 指定数据库名称为 "info.db" 版本号为 1super(context, "info.db", null, 1);}/*create table itype(id integer primary key,shujustitle varchar(10) unique not null,url text not null,isshow varchar(10) not null);*/@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "create table itype(id integer primary key,title varchar(10) unique not null,url text not null,isshow varchar(10) not null)";db.execSQL(sql);String insertSql = "insert into itype values(?,?,?,?)";db.execSQL(insertSql,new Object[]{1,"头条", NewsURL.headline_url,"true"});db.execSQL(insertSql,new Object[]{2,"社会",NewsURL.society_url,"true"});}// 在数据库版本升级时进行表结构更新或数据迁移@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

3.2.2 DBManager

封装对 SQLite 数据库的操作。提供初始化数据库、查询数据和更新数据的方法。

public static SQLiteDatabase database; // 保存数据库的可写实例// 创建一个 DBOpenHelper 实例并获取一个可写的数据库对象public static void initDB(Context context) {DBOpenHelper helper = new DBOpenHelper(context);database = helper.getWritableDatabase();}// 从 SQLite 数据库中查询所有的类型数据并将其转化为一个 TypeBean 对象列表public static List<TypeBean> getAllTypeList() {}// 获取所有要求显示的内容的集合public static List<TypeBean> getSelectedTypeList() {}// 根据输入的 typeList 更新数据库中的isshow字段public static void updateTypeList(List<TypeBean> typeList) {}
}

3.3 适配器类

3.3.1 AddItem

展示新闻类别的列表,结合类型数据和 UI 元素(文本和图像)。根据 TypeBean 中的 isShow来决定图标的显示状态。如果用户点击某一项,该项的状态将被切换,并相应更新图标。点击事件通过匿名内部类实现,允许动态更新 UI。

在这里插入图片描述

// 添加新闻类别的窗口 xml:文本 + 对号// 自定义适配器类public class AddItemAdapter extends BaseAdapter {// 上下文对象,用于获取资源和服务Context context;// 数据源,存储 TypeBean 对象的列表List<TypeBean> mDatas;// 创建视图并绑定数据@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 使用 LayoutInflater 加载自定义布局文件 item_add_lvconvertView = LayoutInflater.from(context).inflate(R.layout.item_add_lv, null);// 初始化convertview中的控件TextView nameTv = convertView.findViewById(R.id.item_add_tv); // 获取文本视图final ImageView iv = convertView.findViewById(R.id.item_add_iv); // 获取图片视图// 获取指定位置的 TypeBean 对象final TypeBean typeBean = mDatas.get(position);// 设置文本视图的内容为 TypeBean 的标题nameTv.setText(typeBean.getTitle());// 根据 TypeBean 的 show 状态设置图片视图的资源// 为了避免用户全都不选中的情况,不符合新闻的展示习惯,所以前两个项必须展示if (position == 0 || position == 1) {iv.setVisibility(View.INVISIBLE); // 隐藏前两个项的勾选框} else {iv.setVisibility(View.VISIBLE); // 显示其他项的勾选框// 设置点击事件监听器convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 切换选中状态// 更新图片视图的资源}});}// 返回当前视图return convertView;}
}

3.3.2 InfoItem

展示新闻数据的列表项,将 InfoBean.ResultBean.DataBean 类型的数据渲染成特定的布局形式。通过内部类 ViewHolder 缓存视图组件的引用,减少性能损耗。通过 ImageLoader 来异步加载网络图片,并显示在对应的 ImageView 中,考虑图片加载失败和 URI 无效的情况。根据每个 DataBean 实例中的图片地址决定是否显示对应的 ImageView。

在这里插入图片描述

// 处理新闻数据DataBean 将这些数据以自定义的布局形式展示
public class InfoItemAdapter extends BaseAdapter {Context context; // 当前应用的上下文List<InfoBean.ResultBean.DataBean> mDatas; // 新闻正文内容ImageLoader imageLoader; // 异步加载和缓存图片DisplayImageOptions options;   // 图片加载配置信息public InfoItemAdapter(Context context, List<InfoBean.ResultBean.DataBean> mDatas) {this.context = context;this.mDatas = mDatas;imageLoader = ImageLoader.getInstance();options = new DisplayImageOptions.Builder();}// 创建或重用视图来展示数据@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 在列表项第一次被创建时找到所有的视图元素并存储在 ViewHolder 对象中// 在后续的显示或重用过程中直接使用这些已存储的引用 避免重复的 findViewById 调用class ViewHolder {TextView titleTv, sourceTv, timeTv; // 新闻标题 新闻来源 发布时间ImageView iv1, iv2, iv3; // 新闻图片缩略图public ViewHolder(View view) {}}ViewHolder holder = null;// 1. 没有可复用的视图if (convertView == null) {// 2. 将自定义的布局文件R.layout.item_newsfrag_lv转换成新的视图convertView = LayoutInflater.from(context).inflate(R.layout.item_newsfrag_lv, null);// 初始化ViewHolder对象来持有视图的子视图引用holder = new ViewHolder(convertView);// 将ViewHolder对象作为标签(tag)存储在convertView上 以便后续复用convertView.setTag(holder);// 3. 有可复用的视图} else {// 直接从视图的标签中获取ViewHolder对象holder = (ViewHolder) convertView.getTag();}// 获取指定位置的数据源// 获取三张图片的地址return convertView;}
}

3.3.3 NewsInfo

管理ViewPager 的多个片段。FragmentStatePagerAdapter该适配器可以动态加载和释放 Fragments, 在 Fragment 不可见时销毁它们以节省内存。重写 getItemPosition 方法使得对数据集的任何更改都能立即反映到 ViewPager 中。getPageTitle为每个页面提供对应的标题。

在这里插入图片描述

// 扩展了 FragmentStatePagerAdapter 来管理 ViewPager 中的多个片段(Fragments)
// 支持在 ViewPager 中动态加载和释放 Fragment
public class NewsInfoAdapter extends FragmentStatePagerAdapter {Context context;List<Fragment> fragmentList;List<TypeBean> typeBeanList;// 指示所有页面都可能改变 Fragment 将在数据集更改时被重新创建@Overridepublic int getItemPosition(@NonNull Object object) {return PagerAdapter.POSITION_NONE;}   // 返回指定位置的标题@Nullable@Overridepublic CharSequence getPageTitle(int position) {TypeBean typeBean = typeBeanList.get(position);String title = typeBean.getTitle();return title;}
}

3.4 Activity模块

3.4.1 MainActivity

显示一个包含多个页面的 ViewPager,用户通过标签条切换不同的页面, 点击添加按钮跳转到一个新的活动来添加新闻类别。初始化界面元素和适配器,获取布局中的视图控件,设置点击事件监听器,初始化片段并设置适配器给 ViewPager,关联 tabStrip 和 ViewPager,使得用户滑动时标签会自动更新。加载用户选择的类型列表,创建对应的 NewsInfoFragment 实例,并将其加入到 fragmentList 中。每个 Fragment 通过 Bundle 接收参数,以便能够根据类型显示不同的信息。当用户点击添加按钮时,启动 AddItemActivity。当 Activity 从停止状态重新启动时,清空之前的数据,重新加载最新的类型信息,更新适配器和标签条。

在这里插入图片描述

public class MainActivity extends AppCompatActivity implements View.OnClickListener {ViewPager mainViewPager; //显示多个页面的视图PagerSlidingTabStrip tabStrip;//用户界面中的标签条,用于导航ImageView addIv;//用于添加项目的图标List<Fragment> fragmentList;  // 存储所有要在 ViewPager 中显示的 FragmentList<TypeBean> selectTypeList;  // 存储 用户选择的类型列表private NewsInfoAdapter adapter;// 设置 ViewPager 内容的适配器public void init() {addIv.setOnClickListener(this);  //添加点击事件的监听fragmentList = new ArrayList<>();selectTypeList = new ArrayList<>();// 初始化页面initPager();// 创建适配器对象// getSupportFragmentManager():获取支持库中的 Fragment 管理器 允许在 Fragment 中进行操作 比如添加、替换或移除adapter = new NewsInfoAdapter(getSupportFragmentManager(), this, fragmentList, selectTypeList);// 设置适配器// 使得ViewPager知道如何 获取和显示与之相关联的Fragment// 适配器负责创建和管理Fragment 向ViewPager提供它们mainViewPager.setAdapter(adapter);// 关联TabStrip和ViewPager// 当用户滑动ViewPager 选中的标签也会发生变化 使得用户可以通过点击标签条快速切换到相应的页面// tabStrip根据ViewPager中的Fragment数量动态生成对应的标签tabStrip.setViewPager(mainViewPager);}// 初始化页面的函数private void initPager() {// 1. 获取用户选择的类型列表List<TypeBean> typeList = DBManager.getSelectedTypeList();selectTypeList.addAll(typeList);for (int i = 0; i < selectTypeList.size(); i++) {// 2.1 为每个类型创建一个 NewsInfoFragment 实例// 2.2 将类型数据通过 Bundle 传递给 NewsInfoFragment实例 并添加到 fragmentList 中Bundle bundle = new Bundle();bundle.putSerializable("type", typeBean);infoFragment.setArguments(bundle);fragmentList.add(infoFragment);}}// 设置点击+号按钮后的操作 -- 跳转到添加类别新页面@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.main_iv_add:// 创建一个 Intent 从当前 MainActivity 跳转到 AddItemActivity(用于添加新闻类别)Intent intent = new Intent(MainActivity.this, AddItemActivity.class);startActivity(intent);break;}}
}

3.4.2 DescActivity

在一个 WebView 中加载和显示网页内容。初始化活动,设置布局 activity_desc。获取 WebView 组件。从 Intent 中提取 URL 字符串。设置 WebView 的各种属性,如启用 JavaScript、缓存方式等。加载指定的 URL。重写 shouldOverrideUrlLoading 方法,以确保所有链接都在同一个 WebView 内打开,而不是跳转到外部浏览器。当用户按下后退键时,如果 WebView 有历史记录,则调用 goBack() 返回上一个页面。如果没有历史记录,调用父类的方法处理其他按键。

在这里插入图片描述

// 在 WebView 中显示网页内容
public class DescActivity extends AppCompatActivity {WebView descWeb;String url;// 设置活动的布局 并获取意图数据中的 URL 用于加载网页@Overrideprotected void onCreate(Bundle savedInstanceState) {descWeb = findViewById(R.id.desc_webview);url = getIntent().getStringExtra("url");// 创建WebView设置类 对于属性进行设置: 启用 JavaScript、允许文件访问、设置缓存模式等WebSettings webSettings = descWeb.getSettings();webSettings.setJavaScriptEnabled(true);  //设置页面支持js交互webSettings.setUseWideViewPort(true);  //将图片调整到适合webview的大小// 设置要加载的网址descWeb.loadUrl(url);// 默认通过手机浏览器打开网址 为了能够直接通过webview打开网址 设置以下操作// 重写 shouldOverrideUrlLoading 方法以确保所有链接都在同一个 WebView 中打开 而不是使用外部浏览器descWeb.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {// 使用webview要加载的urlview.loadUrl(url);return true;}});}
}

3.4.3 AddItemActivity

使用 ListView 展示从数据库中获取的项目类型。通过点击返回按钮,用户可以关闭当前活动并返回到之前的界面。在活动暂停时,更新数据库中的项目类型列表。

在这里插入图片描述

public class AddItemActivity extends AppCompatActivity implements View.OnClickListener {ImageView backIv;ListView addLv;// 数据源List<TypeBean> mDatas;private AddItemAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_item);// 查找控件backIv = findViewById(R.id.add_iv_back);addLv = findViewById(R.id.add_lv);backIv.setOnClickListener(this);mDatas = DBManager.getAllTypeList();// 创建适配器对象adapter = new AddItemAdapter(this, mDatas);// 设置适配器addLv.setAdapter(adapter);}
}

3.4.4 配置类UniteApp

UniteApp用于在应用程序启动时进行全局初始化操作。调用DBManager类的initDB方法进行数据库的初始化操作,在整个应用程序中共享数据库对象。创建一个Volley的请求队列httpQueue,调用initImageLoader方法初始化图片加载框架ImageLoader。创建一个ImageLoaderConfiguration对象,并对其进行配置,包括线程优先级、缓存策略等。调用ImageLoader.getInstance().init方法初始化ImageLoader。提供了静态方法getHttpQueue,用于获取全局的请求队列httpQueue。

3.5 程序运行总体思路

在这里插入图片描述

4 系统测试

图4.1 APP图标
在这里插入图片描述

图4.2 主界面

在这里插入图片描述

图4.3 点击新闻
在这里插入图片描述

图4.4 点击添加按钮
在这里插入图片描述

图4.5 选中新增新闻类别
在这里插入图片描述

图4.6 标签条同步更新
在这里插入图片描述

5 设计总结

在这个开发过程中我根据老师上课讲到的网络爬虫,先行创建了一个测试网络爬虫程序,但是一直报错,提示API次数不够,我在网上搜索了很多文章,终于成功申请了API。但是程序仍然无法运行成功,但是直接通过浏览器却可以获得爬虫数据,搜了很多视频,原来是要重新安装该应用才可以。之后我又通过B站视频学习安卓开使用接SQLite数据库,学习在Android Stdio中使用数据库接口进行数据库编程。对我来说最困难的是整个项目的前期思路构建,一方面是对移动开发的知识遗忘很多,一方面是第一次自己编写大项目。我花了一个星期重新把课件看了一遍,大致了解了Activity,Intent,适配器,Service,网络编程的内容。然后我开始构建思路,我先是把主要的三个界面设计出来,主界面,显示新闻的界面,支持添加新闻类别的界面,对于怎么填充界面,我用到了适配器,将从数据库或网络中的数据根据界面格式显示在布局上。在网络编程中,我搜了很多文章看了很多视频,最终选择只用Volley进行网络请求。在设计数据模型时,我根据老师讲的和课件,抽象出三个数据实体,放在Bean文件夹。另一个,让我困扰好几天的是解析网络爬虫获得的JSON数据,我同样是搜文章搜视频,最后通过AI帮忙解决了这个问题,同时我也觉得AI的设计很有道理,把JSON响应抽象出内部类,和HTTP响应一一对应。同时我认为这个项目我做的并不是很好,在主界面显示新闻简要使用RecycleView会更好,因为涉及到数据量大的时候,RecycleView性能和灵活性都更好。以及在数据库操作时,cursor使用完要关闭,但是我关闭后一直报错,不关闭虽然浪费了资源但是程序可以完整成功的运行,搜了很多文章仍没法解决,不过像这种小型程序,cursor占的资源也无伤大雅。在数据库操作时,由于影响记录条数少,并没有使用事务,不过为了提高代码健壮性,之后我应该使用事务保证数据一致性。其次我认为在编写项目时,为一些条件代码加异常,加调试信息,真是太重要了,并且要写一部分代码就调试,我总是写了很多代码再调,而且也没有详细的调试信息,导致开发进度十分缓慢,每次遇到bug就得停滞很久。不过通过这次编写项目,我对logcat这只小猫的使用理解已经更进一步。总的来说,这次项目开发还算可以,我主要复习掌握了布局设计,ListView,ImagheView,Activity,Intent,适配器,网络编程,数据库操作等知识,更重要的,自己把这些知识串起来,运用到了项目中,成功搭建了类似于今日头条的“明日头条”。同时,我也认识到持续学习和改进的重要性,以便更好地应对未来的挑战。在今后的学习中,我将继续积累经验,完善自己的开发技能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW机械产品几何精度质检系统

随着制造业的发展&#xff0c;对产品质量的要求越来越高&#xff0c;机械产品的几何精度成为衡量其品质的重要指标。为了提高检测效率和精度&#xff0c;开发了一套基于LabVIEW的几何精度质检系统&#xff0c;该系统不仅可以自动化地进行几何尺寸的测量&#xff0c;而且能实时分…

Qt 边框border - qss样式

border属性 实际上&#xff0c;border并不是一个单独的属性&#xff0c;在Qt样式表中&#xff0c;它通常指的是一系列与边框相关的属性的组合。然而&#xff0c;你也可以在一条样式规则中一次性设置所有这些值&#xff0c;如下所示&#xff1a; QPushButton { border: 2px sol…

smardaten无代码这么牛逼?逻辑编排不用代码!

目录 前言 经典案例 ①计划编排&#xff1a;数据操作自动化 ②工单派工&#xff1a;流程变更自动化 smardaten能力解析 一、逻辑控制篇 &#xff08;1&#xff09;变量定义与操作 &#xff08;2&#xff09;数据校验与反馈 &#xff08;3&#xff09;动态数据获取与回填…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译

在Android studio中去编译开源的仓库&#xff0c;大概率就是各种编译不过&#xff0c;一堆错误&#xff0c;一顿改错&#xff0c;基本上会耗费非常多时间&#xff0c;比如&#xff1a; 这个就是改gradle版本&#xff0c;改成7.2 &#xff0c;修改完成之后&#xff0c;还有其他报…

rabbitmq容器化部署

目录 需求 容器化部署rabbitmq服务 部署服务 验证及访问服务 rabbitmq配置LTS 服务验证 rabbitmq配置集群 部署集群 1、创建一个存放配置文件的目录 2、创建配置文件 3、部署各个节点 集群验证 需求 容器化部署rabbitmq服务 基础版本 系统ubuntu 24&#xff0c;docke…

Java后端框架---Spring

目录 一.Spring是什么&#xff1f; 二.Spring Hello World 搭建 三.XML配置bean管理 1.bean标签 2.依赖注入 3.依赖注入的补充 四.注解配置bean管理 1.开启注解扫描 2.使用注解对类进行配置 3.自动注入 五.面向切面编程AOP 1.概述 2.通知 六.spring事务管理 1.数据库…

【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 装了显卡后&#xff0c;开机默认是从显卡的HDMI输出&#xff0c;但这很不方便。如何让视频仍然从主板输出&#xff1f;或者说让显卡HDMI和主板…

系统 IO

"裸奔"层次&#xff1a;不带操作系统的编程 APP(应用程序) -------------------------------- Hardware(硬件) 特点&#xff1a;简单&#xff0c;应用程序直接操作硬件(寄存器) 缺点&#xff1a; 1. 搞应用开发的必须要了解硬件的实现细节&#xff0c;能够看懂原理图…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

Note091203_Outlook邮件撤回操作

Note091203_Outlook邮件撤回操作 如图所示&#xff1a; step1: 打开outlook step2&#xff1a; 点击已发送邮件&#xff0c;选中目标撤回邮件双击打开&#xff1b; step3&#xff1a; 点击图中2框所示&#xff0c;可看见撤回操作&#xff1b; 以上

Linux操作系统 进程(3)

接上文 Linux进程优先级之后&#xff0c;我们了解到僵尸进程与孤儿进程的形成原因&#xff0c;既然是因为父进程没有接收子进程的退出状态导致的&#xff0c;那么我们该如何去获取子进程的退出状态呢&#xff1f;那本篇文章将围绕这个问题来解释进程。 环境 &#xff1a; vsco…

基于CNN的10种物体识别项目

一&#xff1a;数据导入和处理 1.导入相关包&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf2.下载数据 (x_train_all, y_train_all), (x_test, y_test) tf.keras.datasets.cifar10.load_data()# x_valid:测…

【Qt笔记】QTabWidget控件详解

目录 引言 一、基本功能 二、核心属性 2.1 标签页管理 2.2 标签位置 2.3 标签形状 2.4 标签可关闭性 2.5 标签可移动性 三、信号与槽 四、高级功能 4.1 动态添加和删除标签页 4.2 自定义标签页的关闭按钮行为 4.3 标签页的上下文菜单 五、样式设置 六、应用示例…

快速使用react 全局状态管理工具--redux

redux Redux 是 JavaScript 应用中管理应用状态的工具&#xff0c;特别适用于复杂的、需要共享状态的中大型应用。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的状态树&#xff08;state tree&#xff09;中&#xff0c;状态只能通过触发特定的 action 来更新…

硬件基础知识

驱动开发分为&#xff1a;裸机驱动、linux驱动 嵌入式&#xff1a;以计算机技术为基础&#xff0c;软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元&#xff1a;vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc&#xff08;cpu&…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址&#xff1a;https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上&#xff0c;bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

深度学习自编码器 - 收缩自编码器(CAE)篇

序言 在深度学习的浪潮中&#xff0c;收缩自编码器&#xff08; Compressive Autoencoder, CAE \text{Compressive Autoencoder, CAE} Compressive Autoencoder, CAE&#xff09;作为自编码器的一种高级形式&#xff0c;正逐步崭露头角。收缩自编码器在保留自编码器核心功能—…

【贪心算法】贪心算法一

贪心算法一 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.柠檬水找零 题目…