Android之Fragment(二)

本文主要内容

  1. 如何管理Fragment回退栈
  2. Fragment如何与Activity交互
  3. Fragment与Activity交互的最佳实践
  4. 没有视图的Fragment的用处
  5. 使用Fragment创建对话框
  6. 如何与ActionBar,MenuItem集成等

管理Fragment回退栈

类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。
看这样一个效果图:

这里写图片描述

如何添加一个Fragment事务到回退栈:

FragmentTransaction.addToBackStack(String)
下面讲解代码:很明显一共是3个Fragment和一个Activity.
先看Activity的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent" >  <FrameLayout  android:id="@+id/id_content"  android:layout_width="fill_parent"  android:layout_height="fill_parent" >  </FrameLayout>  </RelativeLayout>  

不同的Fragment就在这个FrameLayout中显示。

MainActivity.java

package com.zhy.zhy_fragments;  import android.app.Activity;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.view.Window;  public class MainActivity extends Activity  
{  @Override  protected void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  requestWindowFeature(Window.FEATURE_NO_TITLE);  setContentView(R.layout.activity_main);  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.add(R.id.id_content, new FragmentOne(),"ONE");  tx.commit();  }  }  

很简单,直接将FragmentOne添加到布局文件中的FrameLayout中,注意这里并没有调用FragmentTransaction.addToBackStack(String),因为我不喜欢在当前显示时,点击Back键出现白板。而是正确的相应Back键,即退出我们的Activity.

下面是FragmentOne

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.Button;  public class FragmentOne extends Fragment implements OnClickListener  
{  private Button mBtn;  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_one, container, false);  mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);  mBtn.setOnClickListener(this);  return view;  }  @Override  public void onClick(View v)  {  FragmentTwo fTwo = new FragmentTwo();  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.replace(R.id.id_content, fTwo, "TWO");  tx.addToBackStack(null);  tx.commit();  }  }  

我们在点击FragmentOne中的按钮时,使用了replace方法,如果你看了前一篇博客,一定记得replace是remove和add的合体,并且如果不添加事务到回退栈,前一个Fragment实例会被销毁。这里很明显,我们调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView,证据就是:仔细看上面的效果图,我们在跳转前在文本框输入的内容,在用户Back得到第一个界面的时候不见了。

接下来FragmentTwo

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.Button;  public class FragmentTwo extends Fragment implements OnClickListener  
{  private Button mBtn ;  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_two, container, false);  mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);  mBtn.setOnClickListener(this);  return view ;   }  @Override  public void onClick(View v)  {  FragmentThree fThree = new FragmentThree();  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.hide(this);  tx.add(R.id.id_content , fThree, "THREE");  
//      tx.replace(R.id.id_content, fThree, "THREE");  tx.addToBackStack(null);  tx.commit();  }  }  

这里点击时,我们没有使用replace,而是先隐藏了当前的Fragment,然后添加了FragmentThree的实例,最后将事务添加到回退栈。这样做的目的是为了给大家提供一种方案:如果不希望视图重绘该怎么做,请再次仔细看效果图,我们在FragmentTwo的EditText填写的内容,用户Back回来时,数据还在~~~

最后FragmentThree就是简单的Toast了:

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.Button;  
import android.widget.Toast;  public class FragmentThree extends Fragment implements OnClickListener  
{  private Button mBtn;  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_three, container, false);  mBtn = (Button) view.findViewById(R.id.id_fragment_three_btn);  mBtn.setOnClickListener(this);  return view;  }  @Override  public void onClick(View v)  {  Toast.makeText(getActivity(), " i am a btn in Fragment three",  Toast.LENGTH_SHORT).show();  }  }  

好了,经过上面的介绍,应该已经知道Fragment回退栈是怎么一回事了,以及hide,replace等各自的应用的场景。

这里极其注意一点:上面的整体代码不具有任何参考价值,纯粹为了显示回退栈,在后面讲解了Fragment与Activity通信以后,会重构上面的代码!

Fragment与Activity通信

因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:

a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法

b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

Fragment与Activity通信的最佳实践

因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。
下面我通过两种方式的代码,分别重构,FragmentOne和FragmentTwo的点击事件,以及Activity对点击事件的响应:

首先看FragmentOne

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.Button;  public class FragmentOne extends Fragment implements OnClickListener  
{  private Button mBtn;  /** * 设置按钮点击的回调 * @author zhy * */  public interface FOneBtnClickListener  {  void onFOneBtnClick();  }  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_one, container, false);  mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);  mBtn.setOnClickListener(this);  return view;  }  /** * 交给宿主Activity处理,如果它希望处理 */  @Override  public void onClick(View v)  {  if (getActivity() instanceof FOneBtnClickListener)  {  ((FOneBtnClickListener) getActivity()).onFOneBtnClick();  }  }  }  

可以看到现在的FragmentOne不和任何Activity耦合,任何Activity都可以使用;并且我们声明了一个接口,来回调其点击事件,想要管理其点击事件的Activity实现此接口就即可。可以看到我们在onClick中首先判断了当前绑定的Activity是否实现了该接口,如果实现了则调用。

再看FragmentTwo

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.Button;  public class FragmentTwo extends Fragment implements OnClickListener  
{  private Button mBtn ;  private FTwoBtnClickListener fTwoBtnClickListener ;  public interface FTwoBtnClickListener  {  void onFTwoBtnClick();  }  //设置回调接口  public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)  {  this.fTwoBtnClickListener = fTwoBtnClickListener;  }  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_two, container, false);  mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);  mBtn.setOnClickListener(this);  return view ;   }  @Override  public void onClick(View v)  {  if(fTwoBtnClickListener != null)  {  fTwoBtnClickListener.onFTwoBtnClick();  }  }  }  

与FragmentOne极其类似,但是我们提供了setListener这样的方法,意味着Activity不仅需要实现该接口,还必须显示调用mFTwo.setfTwoBtnClickListener(this)。

最后看Activity :

package com.zhy.zhy_fragments;  import android.app.Activity;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.view.Window;  import com.zhy.zhy_fragments.FragmentOne.FOneBtnClickListener;  
import com.zhy.zhy_fragments.FragmentTwo.FTwoBtnClickListener;  public class MainActivity extends Activity implements FOneBtnClickListener,  FTwoBtnClickListener  
{  private FragmentOne mFOne;  private FragmentTwo mFTwo;  private FragmentThree mFThree;  @Override  protected void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  requestWindowFeature(Window.FEATURE_NO_TITLE);  setContentView(R.layout.activity_main);  mFOne = new FragmentOne();  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.add(R.id.id_content, mFOne, "ONE");  tx.commit();  }  /** * FragmentOne 按钮点击时的回调 */  @Override  public void onFOneBtnClick()  {  if (mFTwo == null)  {  mFTwo = new FragmentTwo();  mFTwo.setfTwoBtnClickListener(this);  }  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.replace(R.id.id_content, mFTwo, "TWO");  tx.addToBackStack(null);  tx.commit();  }  /** * FragmentTwo 按钮点击时的回调 */  @Override  public void onFTwoBtnClick()  {  if (mFThree == null)  {  mFThree = new FragmentThree();  }  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.hide(mFTwo);  tx.add(R.id.id_content, mFThree, "THREE");  // tx.replace(R.id.id_content, fThree, "THREE");  tx.addToBackStack(null);  tx.commit();  }  }  

代码重构结束,与开始的效果一模一样。上面两种通信方式都是值得推荐的,随便选择一种自己喜欢的。这里再提一下:虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是没有特殊理由是绝对不提倡的。Activity担任的是Fragment间类似总线一样的角色,应当由它决定Fragment如何操作。另外虽然Fragment不能响应Intent打开,但是Activity可以,Activity可以接收Intent,然后根据参数判断显示哪个Fragment。

如何处理运行时配置发生变化

我们简单改一下代码,只有在savedInstanceState==null时,才进行创建Fragment实例:

package com.zhy.zhy_fragments;  import android.app.Activity;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Window;  public class MainActivity extends Activity  {  private static final String TAG = "FragmentOne";  private FragmentOne mFOne;  @Override  protected void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  requestWindowFeature(Window.FEATURE_NO_TITLE);  setContentView(R.layout.activity_main);  Log.e(TAG, savedInstanceState+"");  if(savedInstanceState == null)  {  mFOne = new FragmentOne();  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.add(R.id.id_content, mFOne, "ONE");  tx.commit();  }  }  }  

现在无论进行多次旋转都只会有一个Fragment实例在Activity中。
现在还存在一个问题,就是重新绘制时,Fragment发生重建,原本的数据如何保持?
其实和Activity类似,Fragment也有onSaveInstanceState的方法,在此方法中进行保存数据,然后在onCreate或者onCreateView或者onActivityCreated进行恢复都可以。

详情请见:

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案 - Hongyang - 博客频道 - CSDN.NET

Fragmeny与ActionBar和MenuItem集成

Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。

a、在Fragment的onCreate中调用 setHasOptionsMenu(true);
b、然后在Fragment子类中实现onCreateOptionsMenu
c、如果希望在Fragment中处理MenuItem的点击,也可以实现 onOptionsItemSelected;当然了Activity也可以直接处理该MenuItem的点击事件。

Fragment

package com.zhy.zhy_fragments;  import android.app.Fragment;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.Menu;  
import android.view.MenuInflater;  
import android.view.MenuItem;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.Toast;  public class FragmentOne extends Fragment  
{  @Override  public void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  setHasOptionsMenu(true);  }  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)  {  View view = inflater.inflate(R.layout.fragment_one, container, false);  return view;  }  @Override  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)  {  inflater.inflate(R.menu.fragment_menu, menu);  }  @Override  public boolean onOptionsItemSelected(MenuItem item)  {  switch (item.getItemId())  {  case R.id.id_menu_fra_test:  Toast.makeText(getActivity(), "FragmentMenuItem1", Toast.LENGTH_SHORT).show();  break;  }  return true;  }  }  

Activity

package com.zhy.zhy_fragments;  import android.app.Activity;  
import android.app.FragmentManager;  
import android.app.FragmentTransaction;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.Window;  
import android.widget.Toast;  public class MainActivity extends Activity  {  private static final String TAG = "FragmentOne";  private FragmentOne mFOne;  @Override  protected void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  requestWindowFeature(Window.FEATURE_NO_TITLE);  setContentView(R.layout.activity_main);  Log.e(TAG, savedInstanceState + "");  if (savedInstanceState == null)  {  mFOne = new FragmentOne();  FragmentManager fm = getFragmentManager();  FragmentTransaction tx = fm.beginTransaction();  tx.add(R.id.id_content, mFOne, "ONE");  tx.commit();  }  }  @Override  public boolean onCreateOptionsMenu(Menu menu)  {  super.onCreateOptionsMenu(menu);  getMenuInflater().inflate(R.menu.main, menu);  return true;  }  @Override  public boolean onOptionsItemSelected(MenuItem item)  {  switch (item.getItemId())  {  case R.id.action_settings:  Toast.makeText(this, "setting", Toast.LENGTH_SHORT).show();  return true;  default:  //如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx  return super.onOptionsItemSelected(item);  }  }  }  

注意:如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx

效果图:

这里写图片描述

没有布局的Fragment的作用

没有布局文件Fragment实际上是为了保存,当Activity重启时,保存大量数据准备的
请参考博客:
Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案 - Hongyang - 博客频道 - CSDN.NET

7、使用Fragment创建对话框
这是Google推荐的方式,请参考
Android 官方推荐 : DialogFragment 创建对话框 - Hongyang - 博客频道 - CSDN.NET

更多关于Fragment,比如在项目中的最佳实践,请参考

Android Fragment 你应该知道的一切 - Hongyang - 博客频道 - CSDN.NET

完成,参考链接:

Android Fragment 真正的完全解析(下) - Hongyang - 博客频道 - CSDN.NET

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

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

相关文章

带你薅“云”羊毛:定个小目标,先薅他一年

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 一、2022年了&#xff0c;一块钱能干什么&#xff1f; 1块钱 能买一瓶矿泉水 1块钱 能坐一次公交 1块钱 竟然能买来一年的云服务器 哈哈哈&#xff0c;今天西红柿就带大家一块钱白嫖京东云服务器&#xff0c;当然&#xff0c;氪金也是…

ubuntu下搭建android开发环境(转载)

在ubuntu下搭建android开发环境&#xff0c;准备学习一下android开发。 1、安装JDK 首先到oracle的官网上下载linux版本的JDK&#xff08;网址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26&#xff0d;download-400750.html&#xff09;&#x…

《瓦森纳协定》——光刻机为什么就是不卖给中国!

来源&#xff1a;金属加工&#xff08;ID&#xff1a;mw1950pub&#xff09;谈起光刻机相信大家首先想到的是荷兰&#xff0c;确实如此&#xff0c;荷兰光刻机在全球都是数一数二的&#xff0c;就连最顶尖的光刻机制造公司ASML也位于荷兰&#xff0c;二荷兰光刻机之所以这么出名…

Material Design入门(三)

本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPagertabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多&#xff0c;主要有以下几个&#xff1a; CoordinatorLayout 组织它的子views之间协作的一个Layout&#xff0c;它可以给子View切换提供…

干货|2018物流机器人行业报告发布!不容错过

来源&#xff1a;楼今岁阅 摘要&#xff1a;2018年&#xff0c;我们都在谈智能家居、智能交通、智能工业、智能安防等热门物联网话题&#xff0c;并且预计到2020年&#xff0c;中国物联网的整体规模将超过1.8万亿元。发展如此迅速&#xff0c;其涉及的领域一定会越来越广&#…

【年度回忆录】如何做到1年90000粉丝?

亲爱的小伙伴&#xff1a; 小伙伴你好&#xff0c;我是不吃西红柿&#xff0c;仅以此文作为 2021 年终总结&#xff0c;顺便跟大家分享一些博主的心得经验&#xff0c;希望你我和 CSDN 都越来越好&#xff01; 一、C站点滴 翻开 2021 CSDN 年度回忆录&#xff0c;有种难以言…

Material Design综合实例

背景知识 drawlayout的使用 recycleView的使用 CardView的使用 一些开源动画库的使用 ImageView的scaleType属性与adjustViewBounds属性 &#xff0c;参考链接&#xff1a; ImageView的android:adjustViewBounds属性 - - ITeye技术网站 Android ImageView的scaleType属性与…

DARPA将开发无需手术的神经技术,实现脑机接口

来源&#xff1a;IEEE电气电子工程师学会到目前为止&#xff0c;DARPA&#xff08;美国国防部高级研究计划局&#xff09;的神经科学项目部&#xff08;也称为国防部疯狂科学部门&#xff09;一直专注于可服务于那些因身体或大脑残疾回国的士兵的技术&#xff0c;例如&#xff…

2018年全球自动驾驶法律政策研究 | 附报告下载

来源&#xff1a;腾讯研究院摘要&#xff1a;2018年9月13日&#xff0c;在中国法学会研究部、腾讯研究院联合举办的“‘法律人的互联网思维’系列研修会第二期——自动驾驶汽车的技术、产业和法律维度”上&#xff0c;腾讯研究院发布《2018年全球自动驾驶法律政策研究报告》。0…

全球最具影响力AI机构TOP100排名:中国5所高校1所研究院入围

来源&#xff1a;学术头条&#xff08;SciTouTiao&#xff09;现在“人工智能”&#xff08;ArtificialIntelligence&#xff09;一词时常“做客”各大媒体平台&#xff0c;成为人们所关注的热点话题&#xff0c;而在学术圈&#xff0c;AI技术同样也是最具活力与吸引力的研究课…

安卓开源库之动画篇

本文主要介绍收集了笔者所用过的开源动画库&#xff0c;达到一些比较好看的效果。 一个富有动感的 Sheet 链接&#xff1a; zzz40500/AndroidSweetSheet: 一个富有动感的Sheet(选择器) 效果如下 示例代码 package com.zj.testsheet;import android.os.Bundle; import andr…

《Python 黑科技》代理ip奇技淫巧

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 目录 &#x1f41b; 1、什么是住宅动态ip&#xff1f; &#x1f98b; 1.1 动态ip优点是什么&#xff1f; &#x1f40c; 1.2 环境准备 &#x1f41e; 1.3 获取代理ip &#x1f41c; 2、使用代理IP &#x1f424; 2.1 浏览器使用代理…

MIT发布2018年全球10大突破性技术!

来源&#xff1a; 数字化企业作为全球最为著名的技术榜单之一&#xff0c;《麻省理工科技评论》全球十大突破性技术具备极大的全球影响力和权威性&#xff0c;至今已经举办了18年。每年上榜的技术突破&#xff0c;有的已经在现实中得以应用&#xff0c;有的还尚需时日&#xff…

Android实现监测网络状态

本文主要用到了安卓监测网络状态变化功能&#xff0c;实现了WIFI,3G,无网络状态切换时发出通知的功能。 主要知识点 servicebroadcast接口回调实现 service的基本知识 service可分为 按运行地点分类 本地服务 远程服务 按按运行类型分类&#xff1a; 前台服务后台服务按…

jni 步骤

这是我转的文章&#xff0c;是篇外文翻译&#xff0c;将介绍如何学习安装 Android NDK 并开始使用它。在这一教程结束后&#xff0c;将创建你自己的项目&#xff0c;从 Java 代码简单地调用原生C 语言代码。教程细节技术&#xff1a;Android SDK、NDK、C 语言难度&#xff1a;进…

德勤:2025年汽车行业价值链的四个合理情境

来源&#xff1a;亿欧摘要&#xff1a;近日&#xff0c;德勤发布《未来汽车行业价值链&#xff1a;2025年以后》&#xff0c;假设在大部分整车企业都有变革意愿的情境下&#xff0c;识别出四个2025年整车企业价值链可能具有的合理设定。随着自动驾驶、共享经济等新技术以及新商…

盘点英特尔、苹果、高通、AMD 处理器重大 Bug,硬件的坑软件能填?

来源&#xff1a;21ic电子网英特尔的CPU存在两大漏洞 ——Meltdown 和 Spectre&#xff0c;波及自 1995 年以来所有使用英特尔芯片的硬件设备。不止 Linux、Android、Windows、苹果 OS X 等操作系统&#xff0c;AWS、Azure、谷歌云等云计算提供商均受到影响&#xff0c;其威胁范…

java读写html文件时出现中文乱码问题的解决方法

最近在做HTML静态生成&#xff0c;需要从硬盘上把模版文件的内容读出来。然后&#xff0c;替换相关标签写到指定的文件中。无论是读写&#xff0c;都遇到了中文乱码问题。试过多种方法&#xff0c;发现下面一种可以避免中文乱码。&#xff08;无论读取还是写入一定要进行编码转…

Android实现网络音乐播放器

本文是一个简单的音乐播放器 布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layo…

【干货51页PPT】深度学习理论理解探索

来源&#xff1a;专知普林斯顿大学计算机科学系教授Sanjeev Arora做了深度学习理论理解探索的报告&#xff0c;包括三个部分&#xff1a;Why overparametrization and or overprovisioning?Optimization in deep learningTheory for Generative Models and Generative Adversa…