动手实现天气预报App(三)——切换城市手动更新+后台服务自动刷新
文章目录
- 手动更新和后台服务自动刷新及切换城市
- 手动更新天气
- 切换城市
- 后台自动更新
- 1.使用清单文件声明服务
- 2.创建启动服务
- 3.启动服务
- 4.创建绑定服务
- 测试
手动更新和后台服务自动刷新及切换城市
手动更新天气
采用下拉刷新的来实现
<androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/swipe_refresh"><ScrollViewandroid:id="@+id/weather_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"android:overScrollMode="never"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:fitsSystemWindows="true"><include layout="@layout/title"/><include layout="@layout/now"/><include layout="@layout/forecast"/><include layout="@layout/aqi"/><include layout="@layout/suggestion"/></LinearLayout></ScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
使用SwipeRefreshLayout将ScrollView内容包裹住,实现下拉刷新,然后需要更改WeatherActivity中的逻辑,这部分发现书中代码有些许问题,导致切换城市再刷新后仍然显示第一次缓存中的天气信息,故修改代码修复此处bug。主要是通过将WeatherId定义为一个全局变量private String mWeatherId来解决。
private String mWeatherId;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (Build.VERSION.SDK_INT >= 21) {View decorView = getWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);getWindow().setStatusBarColor(Color.TRANSPARENT);}setContentView(R.layout.activity_weather);// 初始化各控件...swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);swipeRefresh.setColorSchemeResources(R.color.colorPrimary);drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);navButton = (Button) findViewById(R.id.nav_button);SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);String weatherString = prefs.getString("weather", null);if (weatherString != null) {// 有缓存时直接解析天气数据Weather weather = Utility.handleWeatherResponse(weatherString);mWeatherId = weather.basic.weatherId;showWeatherInfo(weather);} else {// 无缓存时去服务器查询天气mWeatherId = getIntent().getStringExtra("weather_id");weatherLayout.setVisibility(View.INVISIBLE);requestWeather(mWeatherId);}swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {requestWeather(mWeatherId);}});navButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {drawerLayout.openDrawer(GravityCompat.START);}});String bingPic = prefs.getString("bing_pic", null);if (bingPic != null) {Glide.with(this).load(bingPic).into(bingPicImg);} else {loadBingPic();}
}
修改的代码并不算多,首先在 onCreate()方法中获取到了 SwipeRefreshLayout的实例,然后调用setcolorschemeresources()方法来设置下拉刷新进度条的颜色,这里我们就使用主题中的 colorPrimary作为进度条的颜色了。
然后调用 setOnRefreshListener()方法来设置一个下拉刷新的监听器,当触发了下拉刷新操作的时候,就会回调这个监听器的 onRefresh()方法,我们在这里去调用 requestweather()方法请求天气信息就可以了。
/*** 根据天气id请求城市天气信息。*/public void requestWeather(final String weatherId) {String weatherUrl = "http://guolin.tech/api/weather?cityid=" + weatherId + "&key=bc0418b57b2d4918819d3974ac1285d9";HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {final String responseText = response.body().string();final Weather weather = Utility.handleWeatherResponse(responseText);runOnUiThread(new Runnable() {@Overridepublic void run() {...swipeRefresh.setRefreshing(false);}});}@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(WeatherActivity.this, "获取天气信息失败", Toast.LENGTH_SHORT).show();swipeRefresh.setRefreshing(false);}});}});loadBingPic();}
另外不要忘记,当请求结束后,还需要调用 SwipeRefreshLayout的 setRefreshing()方法,并传入false,用于表示刷新事件结束,并隐藏刷新进度条,此时更新完进度条会自动消失。
切换城市
在这里的思路是将前面写好的城市列表碎片以滑动菜单的形式嵌入天气信息,当需要切换时,滑出城市列表进行点选切换。
先加入一个按钮表示可以切换。
title.xml
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"><Buttonandroid:layout_width="30dp"android:layout_height="30dp"android:id="@+id/nav_button"android:layout_marginLeft="10dp"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:background="@drawable/ic_home"/>...
</RelativeLayout>
接着修改天气信息的界面布局文件,添加滑动菜单功能。
<androidx.drawerlayout.widget.DrawerLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/drawer_layout">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/swipe_refresh">...
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout><fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/choose_area_fragment"android:name="com.wz.myweatherapp.ChooseAreaFragment"android:layout_gravity="start"/></androidx.drawerlayout.widget.DrawerLayout>
DrawerLayout包裹原布局,其中主要包含两个部分,一个是天气界面,一个是城市信息列表的碎片
DrawerLayout中第一个控件用来显示主屏幕内容,第二个控件作为滑动菜单中的内容。
接下来介入滑动菜单额逻辑处理:
public DrawerLayout mDrawerLayout;
private Button navButton;
...navButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mDrawerLayout.openDrawer(GravityCompat.START);}});
很简单,首先在 onCreate()方法中获取到新增的 Drawerlayout和 Button的实例,然后在Button的点击事件中调用 DrawerLayout的 openDrawer方法来打开滑动菜单就可以
不过现在还没有结束,因为这仅仅是打开了滑动菜单而已,我们还需要处理切换城市后的逻辑才行。这个工作就必须要在 ChooseAreaFragment中进行了,因为之前选中了某个城市后是跳转到 WeatherActivity的,而现在由于我们本来就是在 WeatherActivity当的,因此并不需要跳转只是去请求新选择城市的天气信息就可以了。
那么很显然这里我们需要根据 ChooseAreaFragment的不同状态来进行不同的逻辑处理,修改 ChooseAreaFragment中的代码,如下所示
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//可以看到,我们使用 setonItemClicklistener()方法为 Listview注册了一个监听器,当//用户点击了 Listview中的任何一个子项时,就会回调 onItemclick()方法。在这个方法中可以//通过 position参数判断出用户点击的是哪一个子项,然后获取到相应的类信息,并通过Toast显示@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int pos, long idl) {//当你点击了某个item的时候会进入到 List view的 onItemclick()方法中,这个时候会根据当//前的级别来判断是去调用 querycities()方法还是 query Counties()方法, queryCities()方//法是去査询市级数据,而 queryCounties()方法是去查询县级数据,这两个方法内部的流程和//queryProvinces()方法基本相同if (currentLevel == LEVEL_PROVINCE){selectedProvince = provinceList.get(pos);queryCity();}else if (currentLevel == LEVEL_CITY){selectedCity = cityList.get(pos);queryCounty();}else if (currentLevel == LEVEL_COUNTY){//非常简单,这里在 onitemclick()方法中加入了一个if判断,如果当前级别是 LEVEL//COUNTY,就启动 WeatherActivity,并把当前选中县的天气i传递过去。String weatherId = countyList.get(pos).getWeatherId();//这里使用了一个Java中的小技巧, instanceof关键字可以用来判断一个对象是否属于某//个类的实例。我们在碎片中调用 getActivity()方法,然后配合 instanceof关键字,就能轻//松判断出该碎片是在 MainActivity当中,还是在 WeatherActivity当中。如果是在 MainActivity当//中,那么处理逻辑不变。如果是在 WeatherActivity当中,那么就关闭滑动菜单,显示下拉刷新进//度条,然后请求新城市的天气信息if(getActivity() instanceof MainActivity){Intent intent = new Intent(getActivity(),WeatherActivity.class);intent.putExtra("weather_id",weatherId);startActivity(intent);getActivity().finish();}else if (getActivity() instanceof WeatherActivity){WeatherActivity activity = (WeatherActivity) getActivity();activity.mDrawerLayout.closeDrawers();activity.mSwipeRefreshLayout.setRefreshing(true);activity.requestWeather(weatherId);//Log.d(TAG, "onItemClick: "+"getActivity() instanceof WeatherActivity"+weatherId);}}}
});
然后我们就可以切换其他城市了。选中城市之后滑动菜单会自动关闭,并且主界面上的天气信息也会更新成你选择的那个城市。
后台自动更新
创建服务来实现后台的自动刷新天气信息的功能。
可以看到,在 onstartcommand()方法中先是调用了 updateweather()方法来更新天气然后调用了 updateBingPic()方法来更新背景图片。这里我们将更新后的数据直接存储到SharedPreferences文件中就可以了,因为打开WeatherActivity的时候都会优先从 SharedPreferences缓存中读取数据。
之后就是创建定时任务的技巧了,为了保证软件不会消耗过多的流量,这里将时间间隔设置为8小时,8小时后 AutoUpdateReceiver的 onstart command()方法就会重新执行,这样也就实现后台定时更新的功能了。
public class AutoUpdateService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {updateWeather();updateBingPic();AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);int anHour = 8*60*60*1000;long triggerAtTimer = SystemClock.elapsedRealtime() + anHour;Intent i = new Intent(this,AutoUpdateService.class);PendingIntent pi = PendingIntent.getService(this, 0, i, 0);manager.cancel(pi);manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTimer,pi);return super.onStartCommand(intent, flags, startId);}private void updateBingPic() {String requestBingPic = "http://guolin.tech/api/bing_pic";HttpUtil.sendOkHttpRequest(requestBingPic, new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {final String bingPic = response.body().string();SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(AutoUpdateService.this).edit();editor.putString("bing_pic",bingPic);editor.apply();}});}private void updateWeather() {SharedPreferences pres = PreferenceManager.getDefaultSharedPreferences(this);String weatherString = pres.getString("weather", null);if (weatherString != null){//有缓存时 直接解析天气数据Weather weather = Utility.handleWeatherResponse(weatherString);String weatherId = weather.basic.weatherId;String weatherUrl = "http://guolin.tech/api/weather?cityid=" + weatherId +"&key=755a053d247341699ebbe941099d994f";HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {final String responseText = response.body().string();final Weather weather = Utility.handleWeatherResponse(responseText);if (weather != null&&"ok".equals(weather.status)){SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(AutoUpdateService.this).edit();editor.putString("weather",responseText);editor.apply();}}});}}}
关于服务的使用,官网文档中介绍如下:
如要创建服务,您必须创建 Service
的子类(或使用它的一个现有子类)。在实现中,您必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。以下是您应重写的最重要的回调方法:
-
onStartCommand()
当另一个组件(如 Activity)请求启动服务时,系统会通过调用
startService()
来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行。如果您实现此方法,则在服务工作完成后,您需负责通过调用stopSelf()
或stopService()
来停止服务。(如果您只想提供绑定,则无需实现此方法。) -
onBind()
当另一个组件想要与服务绑定(例如执行 RPC)时,系统会通过调用
bindService()
来调用此方法。在此方法的实现中,您必须通过返回IBinder
提供一个接口,以供客户端用来与服务进行通信。请务必实现此方法;但是,如果您并不希望允许绑定,则应返回 null。 -
onCreate()
首次创建服务时,系统会(在调用
onStartCommand()
或onBind()
之前)调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。 -
onDestroy()
当不再使用服务且准备将其销毁时,系统会调用此方法。服务应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。
如果组件通过调用 startService()
启动服务(这会引起对 onStartCommand()
的调用),则服务会一直运行,直到其使用 stopSelf()
自行停止运行,或由其他组件通过调用 stopService()
将其停止为止。
如果组件通过调用 bindService()
来创建服务,且未调用 onStartCommand()
,则服务只会在该组件与其绑定时运行。当该服务与其所有组件取消绑定后,系统便会将其销毁。
只有在内存过低且必须回收系统资源以供拥有用户焦点的 Activity 使用时,Android 系统才会停止服务。如果将服务绑定到拥有用户焦点的 Activity,则它其不太可能会终止;如果将服务声明为在前台运行,则其几乎永远不会终止。如果服务已启动并长时间运行,则系统逐渐降低其在后台任务列表中的位置,而服务被终止的概率也会大幅提升—如果服务是启动服务,则您必须将其设计为能够妥善处理系统执行的重启。如果系统终止服务,则其会在资源可用时立即重启服务,但这还取决于您从 onStartCommand()
返回的值。如需了解有关系统会在何时销毁服务的详细信息,请参阅进程和线程文档。
下文将介绍如何创建 startService()
和 bindService()
服务方法,以及如何通过其他应用组件使用这些方法。
1.使用清单文件声明服务
如同对 Activity 及其他组件的操作一样,您必须在应用的清单文件中声明所有服务。
如要声明服务,请添加 service
元素作为 application
元素的子元素。下面是示例:
<manifest ... >...<application ... ><service android:name=".ExampleService" />...</application>
</manifest>
您还可在 service
元素中加入其他属性,以定义一些特性,如启动服务及其运行时所在进程需要的权限。android:name
属性是唯一必需的属性,用于指定服务的类名。发布应用后,请保此类名不变,以避免因依赖显式 Intent 来启动或绑定服务而破坏代码的风险。
注意:为确保应用的安全性,在启动
Service
时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务会响应 Intent,而用户也无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用bindService()
,则系统会抛出异常。
您可以通过添加 android:exported
属性并将其设置为 false
,确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即便在使用显式 Intent 时也如此。
注意:用户可以查看其设备上正在运行的服务。如果他们发现自己无法识别或信任的服务,则可以停止该服务。为避免用户意外停止您的服务,您需要在应用清单的 `` 元素中添加
android:description
。请在描述中用一个短句解释服务的作用及其提供的好处。
2.创建启动服务
启动服务由另一个组件通过调用 startService()
启动,这会导致调用服务的 onStartCommand()
方法。
服务启动后,其生命周期即独立于启动它的组件。即使系统已销毁启动服务的组件,该服务仍可在后台无限期地运行。因此,服务应在其工作完成时通过调用 stopSelf()
来自行停止运行,或者由另一个组件通过调用 stopService()
来将其停止。
应用组件(如 Activity)可通过调用 startService()
方法并传递 Intent
对象(指定服务并包含待使用服务的所有数据)来启动服务。服务会在 onStartCommand()
方法接收此 Intent
。
例如,假设某 Activity 需要将一些数据保存到在线数据库中。该 Activity 可以启动一个协同服务,并通过向 startService()
传递一个 Intent,为该服务提供要保存的数据。服务会通过 onStartCommand()
接收 Intent,连接到互联网并执行数据库事务。事务完成后,服务将自行停止并销毁。
**注意:**默认情况下,服务与服务声明所在的应用运行于同一进程,并且运行于该应用的主线程中。如果服务在用户与来自同一应用的 Activity 进行交互时执行密集型或阻止性操作,则会降低 Activity 性能。为避免影响应用性能,请在服务内启动新线程。
通常,您可以扩展两个类来创建启动服务:
-
Service
这是适用于所有服务的基类。扩展此类时,您必须创建用于执行所有服务工作的新线程,因为服务默认使用应用的主线程,这会降低应用正在运行的任何 Activity 的性能。
-
IntentService
这是
Service
的子类,其使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,此类为最佳选择。实现onHandleIntent()
,该方法会接收每个启动请求的 Intent,以便您执行后台工作。
3.启动服务
您可以通过将 Intent
传递给 startService()
或 startForegroundService()
,从 Activity 或其他应用组件启动服务。Android 系统会调用服务的 onStartCommand()
方法,并向其传递 Intent
,从而指定要启动的服务。
例如,Activity 可以结合使用显式 Intent 与 startService()
,从而启动上文中的示例服务 (HelloService
):
Intent intent = new Intent(this, HelloService.class);
startService(intent);
startService()
方法会立即返回,并且 Android 系统会调用服务的 onStartCommand()
方法。如果服务尚未运行,则系统首先会调用 onCreate()
,然后调用 onStartCommand()
。
如果服务亦未提供绑定,则应用组件与服务间的唯一通信模式便是使用 startService()
传递的 Intent。但是,如果您希望服务返回结果,则启动服务的客户端可以为广播(通过 getBroadcast()
获得)创建一个 PendingIntent
,并将其传递给启动服务的 Intent
中的服务。然后,服务便可使用广播传递结果。
多个服务启动请求会导致多次对服务的 onStartCommand()
进行相应的调用。但是,如要停止服务,只需一个服务停止请求(使用 stopSelf()
或 stopService()
)即可。
在WeatherActivity中添加代码
private void showWeatherInfo(Weather weather) {......mWeatherLayout.setVisibility(View.VISIBLE);Intent intent = new Intent(this, AutoUpdateService.class);startService(intent);}
4.创建绑定服务
绑定服务允许应用组件通过调用 bindService()
与其绑定,从而创建长期连接。此服务通常不允许组件通过调用 startService()
来启动它。
如需与 Activity 和其他应用组件中的服务进行交互,或需要通过进程间通信 (IPC) 向其他应用公开某些应用功能,则应创建绑定服务。
如要创建绑定服务,您需通过实现 onBind()
回调方法返回 IBinder
,从而定义与服务进行通信的接口。然后,其他应用组件可通过调用 bindService()
来检索该接口,并开始调用与服务相关的方法。服务只用于与其绑定的应用组件,因此若没有组件与该服务绑定,则系统会销毁该服务。您不必像通过 onStartCommand()
启动的服务那样,以相同方式停止绑定服务。
如要创建绑定服务,您必须定义指定客户端如何与服务进行通信的接口。服务与客户端之间的这个接口必须是 IBinder
的实现,并且服务必须从 onBind()
回调方法返回该接口。收到 IBinder
后,客户端便可开始通过该接口与服务进行交互。
多个客户端可以同时绑定到服务。完成与服务的交互后,客户端会通过调用 unbindService()
来取消绑定。如果没有绑定到服务的客户端,则系统会销毁该服务。
实现绑定服务有多种方法,并且此实现比启动服务更为复杂。出于这些原因,请参阅另一份文档绑定服务,了解关于绑定服务的详细介绍。
可以看到,这里在 showweather()方法的最后加入启动 AutoUpdateService这个服务的代码
这样只要一旦选中了某个城市并成功更新天气之后, AutoUpdateService就会一直在后台运行,并保证每8小时更新一次天气。
测试
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- BLEU 评价 NLP 文本输出质量
bb5.jpg" alt=“慎用!BLEU评价NLP文本输出质量存在严重问题”> <div AI 前线导读:在评价机器翻译系统时,译文质量究竟如何,无法通过文本形式的输出直观地提现,因此需要采用一些适当的量化标准对机器翻译的译文输出进行评价,这也就催生了几个评价指标。而 BLEU…...
2024/4/27 23:55:40 - 宝塔面板添加站点并配置SSL
概述 如果还有不了解宝塔面板怎么使用的小伙伴,可以看下前文:宝塔面板教程(1)基于云服务器搭建宝塔面板教程最全详解 宝塔面板教程(2)宝塔面板添加WordPress站点详细图文教程 宝塔面板教程(3)基于宝塔面板成功配置网站SSL安全证书 宝塔面板教程(4)WordPress网站的备…...
2024/4/27 23:06:46 - 2020危险化学品经营单位主要负责人证考试及危险化学品经营单位主要负责人考试试题
题库来源:安全生产模拟考试一点通公众号小程序2020危险化学品经营单位主要负责人证考试及危险化学品经营单位主要负责人考试试题,包含危险化学品经营单位主要负责人证考试答案解析及危险化学品经营单位主要负责人考试试题练习。由安全生产模拟考试一点通公众号结合国家危险化…...
2024/4/28 19:20:10 - Vue学习02——本地应用
v-text指令v-text指令的作用是:设置标签的文本值 默认写法会替换全部内容,使用插值表达式{{}}可以替换指定内容 内部支持写表达式<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport&…...
2024/4/28 21:32:26 - win_api_3
PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...LPCWSTR text1 = TEXT("string test");Rectangle(hdc, 0, 0, 400, 20);COLORREF color1 = RGB(0, 255, 0);COLORREF color2 = RGB(255, 0, 0);::SetTextColor(hdc…...
2024/4/28 13:20:28 - 进阶必备,5个低调实用的mac使用技巧分享~
mac电脑的强大无可厚非,刚开始不了解Mac的话使用起来会觉得很麻烦比如它大量的隐藏方式、功能等等,小编今天总结到了几个非常有用但有可能您不太知道的技巧分享一下,感兴趣的来一起看看吧~ 进阶必备,5个低调实用的mac使用技巧分享~ 1.Spotlight快速搜索 与iphone一样,MAC里…...
2024/4/28 2:45:34 - sql语句的执行顺序
sql语句的书写顺序SELECT DISTINCT<Select_list>FROM <left_table> <join_type>JOIN<right_table> ON<join_condition>WHERE<where_condition>GROUP BY<group_by_list> WITH {CUBE|ROLLUP} HAVING<having_condtion>ORDE…...
2024/4/28 4:22:23 - 逻辑漏洞之无密码登录(vlcms)
目录漏洞原理演示逻辑图靶场cms下载 漏洞原理 无密码登录,说到这个,大家可能想到的是下面这几种方法。 一种是用第三方账户,比如使用QQ登录,使用微博登录。 一种就是邮箱登录,比如只要输入email地址,然后网站就会给你的邮箱发一条邮件,邮件里有条链接,你只要点击链接就…...
2024/4/27 23:31:26 - (2020)React Native入门-React Navigation 5.x+react-native-vector-icons+实现夜间模式
知识点GETReact Navigation 5.x安装react-native-vector-icons安装与配置React Navigation传参和跳转夜间模式的支持演示 实现效果普通模式夜间模式新建RN项目npx react-native init NavigationDemo换国内清华大学的提高速度(非必须)ios/Podfile文件头部增加下面source https…...
2024/4/27 22:37:37 - LeetCode 107 二叉树的层次遍历 II
LeetCode 107 二叉树的层次遍历 II 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7返回其自底向上的层次遍历为: [[15,7],[9,20],[3] ]自上而…...
2024/4/28 18:40:24 - 剑指 Offer 42. 连续子数组的最大和【字节】
class Solution { public:int maxSubArray(vector<int>& nums) {int res = nums[0];for(int i = 1; i < nums.size(); i++) {nums[i] += max(nums[i - 1], 0);res = max(res, nums[i]);}return res;} };...
2024/4/28 12:49:37 - Dockerfile的常用指令
Dockerfile命令格式: #nginx:test(镜像名称:镜像标签) docker build -t nginx:test .1.CMD 功能:CMD指令用于指定一个容器启动时要运行的命令。 例:这里我们将-l标志传递给了/bin/bash命令。 CMD ["/bin/bash","-l"]Docker推荐一直使用以数组语法来设置…...
2024/4/28 23:06:09 - MongoDB密码配置教程
1.简介 通过查阅MongoDB官网,我们可以知道,MongoDB是一款基于分布式文件存储的数据库.区别于传统的关系型数据库,MongoDB的记录是一个文档,它是由字段和值组成的数据结构,类似于Json的Bson对象,且支持嵌套对象。在理解上我们可以内推下Json格式。在部署上,MongoDB好比文…...
2024/4/28 23:30:13 - Java基本数据类型默认值总结
byte: 默认值:0 shor: 默认值:0 int:默认值:0 long: 默认值:0L float: 默认值:0.0f double: 默认值:0.0d boolean: 默认值:false char:...
2024/4/28 0:55:55 - MyBatis总结(二)
一对一关联映射 创建数据库表 use eshop #创建数据库表idcard create table idcard(id int primary key auto_increment,cno varchar(18) ); #插入测试数据 insert into idcard(cno) values(320100197001010001); insert into idcard(cno) values(320100197001010002); insert …...
2024/4/19 5:57:59 - cp指令的编写
Cp 原文件 目标文件 1、C语言的参数 2、思路: (补充:) int main(int argc,char **argv){//**argv里的每一项都是数组 argc表示三个参数printf("total par ams %d\n",argc);printf("NO.1 par ams %s\n",argv[0]);printf("NO.2 par ams %s\n"…...
2024/4/28 9:52:18 - 升级更新 Windows10
升级更新 Windows10:获取 Windows 更新助手 升级 Windows10,它是先下载 Windows10 系统镜像,然后才升级。在下载完 Windows10 后,升级前,有一步骤会询问:(1)保留所有文件和应用 (2)不保留。我们选择 (1)保留所有文件和应用 这个选项,所有文件和应用就都会保留的。...
2024/4/8 1:54:17 - elasticsearch根据字段聚合后,排序取第一条记录
前言 使用elasticsearch查询分页时遇到需要先对某个条件聚合后再取每个桶中的第一条记录的情况,请教了下同事,再自身研究了一些时间才搞出来,特做此记录,希望也能帮到大家吧~ ~ 这里用的elasticsearch版本是6.4.3。 {"from": 0,"size": 0,"query&…...
2024/4/27 20:23:43 - 数据结构(二)算法
数据结构(二)算法算法的定义算法的特性算法的设计和要求正确性可读性健壮性时间效率高和存储量低算法时间复杂度如何分析一个算法的时间复杂度呢?常见的时间复杂度算法空间复杂度 算法的定义 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指…...
2024/4/8 16:35:04 - 『杭电1594』find the max
Problem Description有一个离散函数f(x),x = {1, 2, ,,,,N},f(x)<2^31。现在要找出2个点i,j, 使得函数在这2点之间的点都在这2点连线下方,且此连线的斜率的绝对值越大越好。Input输入包括多个测试实例。每个测试实例包括2行,第一行为一个整数N,2 <= N <= 100000, …...
2024/4/24 15:39:18
最新文章
- 线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!
在科技飞速发展的大背景下,年轻人社交不再局限于面对面,线上社交app已深入各大年轻人的手机中。相比于传统交友方式,线上社交app为用户提供了更加新奇的交友体验。同时,它还可以吸引更多的朋友,提高用户的整体交友体验…...
2024/4/29 0:21:26 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 企业计算机服务器中了locked勒索病毒怎么办,locked勒索病毒解密流程步骤
网络技术的不断发展为企业的生产运营提供了极大便利,也让企业的生产效率大大提高,但网络是一把双刃剑,给给企业的数据安全问题带来严重威胁。近期,云天数据恢复中心接到浙江某商贸公司的求助,企业计算机服务器遭到了lo…...
2024/4/27 8:52:44 - 文心一言 vs GPT-4 —— 全面横向比较
对于文心一言和 GPT-4 这两者之间的全面横向比较,我们可以从多个方面来看待它们的区别和优劣势。 文心一言 文心一言是一款基于深度学习的中文文本生成模型,专注于生成优美的古风诗句和语录。以下是它的一些特点: 专注于古风诗句和语录: 文…...
2024/4/24 17:52:27 - C++类继承基础3——访问控制与继承
私有继承 在C中,私有继承是一种继承方式,它定义了一个私有派生类,也称为派生类。私有继承意味着派生类继承了基类的所有成员,但这些成员在派生类中是私有的,对外部不可见。 要进行私有继承请使用private关键字&#…...
2024/4/25 20:58:35 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/28 4:04:40 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/28 12:01:04 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/28 16:34:55 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/28 18:31:47 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/28 12:01:03 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/28 12:01:03 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/28 12:01:03 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/28 16:07:14 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/28 23:42:05 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/28 9:00:42 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/27 18:40:35 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/28 4:14:21 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/27 13:52:15 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/27 13:38:13 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/28 12:00:58 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/28 12:00:58 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/27 22:51:49 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/28 7:31:46 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/28 8:32:05 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/27 20:28:35 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57