日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

發(fā)布時(shí)間:2023/12/10 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說明

  • 源代碼
  • 在2.x里有TCP的三次揮手與四次握手,先對(duì)它進(jìn)行簡(jiǎn)單的回答(百度).預(yù)計(jì)在下一篇里,會(huì)繼續(xù)說明TCP
  • 接上一篇: Android Studio — > [學(xué)習(xí)筆記]Button、TextView、EditText

2.5 RadioButton

  • 常用屬性
  • 自定義樣式
  • 監(jiān)聽事件

2.5.1 新建按鈕,并跳轉(zhuǎn)到相應(yīng)的活動(dòng)頁面

1.在com.skypan.textview下新建一個(gè)RadioButtonActivity活動(dòng)
2.在主樣式,新增一個(gè) RadioButton按鈕

<Buttonandroid:id="@+id/btn_radiobutton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Radio Button"android:textAllCaps="false"/>

3.在主活動(dòng)中,添加按鈕的跳轉(zhuǎn)事件

public class MainActivity extends AppCompatActivity {// 聲明按鈕private Button mBtnRadioButton;@overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBtnRadioButton = (Button) findViewById(R.id.btn_radiobutton);mBtnRadioButton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {// 跳轉(zhuǎn)到 RadioButton 界面Intent intent = new Intent(MainActivity.this, RadioButtonActivity.class);startActivity(intent);}})} }

2.5.2 封裝View.OnClickListener

[說明] : 在主活動(dòng)中,多次使用到這個(gè)方法,其中僅僅部分改變.因此將該方法提取出來.
1.提取出方法

private class OnClick implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent = null;switch (v.getId()){case R.id.btn_textview:// 跳轉(zhuǎn)到 TextView 演示界面intent = new Intent(MainActivity.this, TextViewActivity.class);break;case R.id.btn_button:intent = new Intent(MainActivity.this, ButtonActivity.class);break;case R.id.btn_edittext:intent = new Intent(MainActivity.this, EditTextActivity.class);break;case R.id.btn_radiobutton:intent = new Intent(MainActivity.this, RadioButtonActivity.class);break;}startActivity(intent);} }

2.設(shè)置啟動(dòng)函數(shù)

private void setListeners(){Onclick onclick = new Onclick();mBtnTextView.setOnClickListener(onClick);mBtnButton.setOnClickListener(onClick);mBtnEditText.setOnClickListener(onClick);mBtnRadioButton.setOnClickListener(onClick); }

2.5.3 單選按鈕的監(jiān)聽事件:

  • 按鈕組的布局如下:
<RadioGroupandroid:id="@+id/rg_1"... /><RadioButtonandroid:id="@+id/rb_1"android:text=""/><RadioButtonandroid:id="@+id/rb_2"android:id=""/> </RadioGroup>
  • 監(jiān)聽函數(shù)如下:
public class RadioButtonActivity extends AppCompatActivity {private RadioGroup mRg1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mRg1 = (RadioGroup) findViewById(R.id.rg_1);mRg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {RadioButton radioButton = (RadioButton) group.findViewById(checkedId);Toast.makeText(RadioButtonActivity.this, radioButton.getText(),Toast.LENGTH.SHORT).show();}})} }

[說明] :
1.一個(gè)活動(dòng)對(duì)應(yīng)的是一個(gè)類
2.所有活動(dòng)都繼承一個(gè)基類AppCompatActiviry
3.protected: 自己和子類都能使用.
4.private: 除了自己之外,其他類都無法使用

2.5.x 參數(shù)說明:

1.android:checked: 默認(rèn)選中
2.android:state_checked="true": 點(diǎn)擊時(shí)顯示的樣式
3.<solid android:color="#cc7a00">: 一個(gè)矩形的顏色填充塊
4.<stroke android:width="1dp">: 1個(gè)單位寬度的矩形線
5.corners android:radius="15dp": 矩形的邊角曲率15個(gè)單位

[報(bào)錯(cuò)]:
1.Variable 'intent' might not have been initialized: 變量intent沒有初始化

2.6 復(fù)選框 CheckBox

  • 常用屬性
  • 自定義樣式
  • 監(jiān)聽事件

2.6.1 線性垂直布局 + 復(fù)選框基本語法

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_below="@id/cb_6"android:layout_marginTop="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="你的興趣:"android:textColor="#000"/><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_7"android:text="編程"android:textSize="20sp"android:layout_marginTop="5sp" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_8"android:text="編程"android:textSize="20sp"android:layout_marginTop="5sp"/></LinearLayout>

2.6.2 制作帶圖標(biāo)的復(fù)選框

1.準(zhǔn)備好2個(gè)圖標(biāo) icon1 和 icon2
2.將2個(gè)圖標(biāo)放入res/drawable-xxhdpi
3.準(zhǔn)備選擇器: bg_check.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:state_checked="false"android:drawable="@drawable/icon_checkbox_false" /><itemandroid:state_checked="true"android:drawable="@drawable/icon_checkbox_true" /> </selector>

[說明] :

  • (1)android:state_checked='false': 未選中
  • (2)android:drawble='@drawable/icon_checkbox_false': 使用icon_checkbox_false圖標(biāo)

4.在CheckBox中使用 Selector: bg_check.xml

<CheckBox...android:button="@drawable/bg_check" >

2.6.3 給復(fù)選框添加事件

1.假設(shè)復(fù)選框的id為 cb_1 和 cb_2
2.編寫復(fù)選框的活動(dòng)如下: CheckBoxActivity.java

public class CheckBoxActivity extends AppCompatActivity {// 聲明控件private CheckBox mCb1, mCb2;@overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 獲取控件的視圖mCb1 = (CheckBox) findViewById(R.id.cb_1);mCb2 = (CheckBox) findViewById(R.id.cb_2);mCb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){@overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? '1選中': '1取消', Toast.LENGTH_SHORT).show();}})mCb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){@overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Toast.makeText(CheckBoxActivity.this, isChecked? '2選中': '2取消', Toast.LENGTH_SHORT).show();}})} }

2.7 ImageView

  • Button的其他衍生控件: ToggleButton、Switch(略)
  • 常用屬性
  • 加載網(wǎng)絡(luò)圖片

2.7.1 最基本的ImageView語法

  • activity_image_view.xml
<ImageViewandroid:layout_width="300dp"android:layout_height="200dp"android:background="#ff9900"android:src="@drawable/bg_icon_man"android:scaleType="fixXY"/>

[說明] :
1.android:scaleType="fixXY": 撐滿控件,寬高比可能發(fā)生變化
2.android:scaleType="fitCenter": 保持寬高比縮放,直到能完全顯示
3.android:scaleType="centerCrop": 保持寬高比縮放,直至完全覆蓋控件,裁剪顯示

2.7.2 使用ImageView加載一張網(wǎng)絡(luò)圖片

1.寫好控件: activity_image_view.xml

<ImageViewandroid:id="@+id/iv_4"android:layout_width="200dp"android:layout_height="100dp"/>

2.配置glide: /app/build.gradle

repositories {mavenCentral()google() } dependencies {implementation 'com.github.bumptech.glide:glide:4.10.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' }

[說明] :

  • (1)使用glide進(jìn)行網(wǎng)絡(luò)資源請(qǐng)求
  • (2)Android Studio編譯器可以自動(dòng)的按照 build.gradle 中的配置進(jìn)行Jar包同步

3.獲取控件iv_4,并使用glide往里面加資源

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import com.bumptech.glide.Glide;public class ImageViewActivity extends AppCompatActivity {private ImageView mIv4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_view);mIv4 = (ImageView) findViewById(R.id.iv_4);Glide.with(this).load("https://www.baidu.com/img/bd_logo1.png").into(mIv4);} }

[報(bào)錯(cuò)] :

  • 1)Request threw uncaught throwable java.lang.SecurityException: Permission denied (missing INTERNET permission?): 使用glide進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),需要配置權(quán)限.在路徑/app/src/main/AndroidMainfest.xml中添加網(wǎng)絡(luò)權(quán)限如下:
<use-permission android:name="android.permission.INTERNET" />

2.8 列表視圖ListView(知道,被RecyclerView替代)

  • 常用屬性
  • Adapter接口
  • Demo演示

2.8.1 創(chuàng)建一個(gè)ListViewActivity(手動(dòng)導(dǎo)入依賴)

  • 1)在com.skypan.textview包下,新建一個(gè)包listview
  • 2)在listview下,新建一個(gè)Java類.注意: Name: ListViewActivity 和 Superclass: android.app.Activity
  • 3)創(chuàng)建視圖: activity_listview.xml, 在路徑 /app/src/main/res/layout
  • 4)完善ListViewActivity.java:
package com.skypan.textview.listview; import android.app.Activity; import andoird.os.Bundle; import androidx.annotation.Nullable; import com.skypan.textview.R;public class ListViewActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);} }
  • 5)將AndroidManifex.xml聲明ListViewActivity.java
<activity android:name=".listview.ListViewActivity" />

2.8.2 自定義顏色 + 使用

  • 1)在/app/src/main/res/values/colors.xml中寫入自定義顏色,如下
<resources><color name="colorGray">#D5D5D5</color> </resources>
  • 2)使用
<TextViewandroid:textColor="@color/colorGrayDark" />

2.8.3 自定義List View 按壓樣式

  • 1)新建一個(gè)選擇器(Selector): /app/src/main/res/drawable -> new Drawable Resource file -> layout_list_item.xml
  • 2)list_item.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/colorAcecent" android:state_pressed="true" /><item android:drawable="@color/colorWhite" android:state_pressed="false" /> </selector>
  • 3)在List View中使用: activity_listview.xml
<ListViewandroid:id="@+id/lv_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:listSelector="@drawable/list_item" />

2.8.4 List View的點(diǎn)擊事件

[參數(shù)]:

  • 1)setOnItemClickListener: 點(diǎn)擊事件
  • 2)setOnItemLongClickListener: 長(zhǎng)按事件
import android.app.Activity; import android.os.Bundle; import android.widget.AdapterView; import android.widget.Toast; import android.widget.ListViewpublic class ListViewActivity extends Activity {// 聲明 ListView控件private ListView mLv1;@Overrideprotected void onCrete(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);mLv1 = (ListView) findViewById(R.id.lv_1);mLv1.setAdapter(new MyListAdapter(ListViewActivity.this));mLv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Toast.makeText(ListViewActivity.this, text:"點(diǎn)擊了" + position, Toast.LENGTH_SHORT).show();}});} }

[說明] :

  • 1)公有類ListViewActivity繼承安卓的app下面的公有類Activity
  • 2)ListView來自Android.widget.ListView
  • 3)適配器類MyListAdapter代碼如下:@/src/main/java/com.skypan.textview/listview/MyListAdapter.java
package com.skypan.textview.listview;import android.widget.BaseAdapter; import android.content.Context; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.TextView; import android.view.View; import android.view.ViewGroup;import com.bumptech.glide.Glide; import com.skypan.textview.R;public class MyListAdapter extends BaseAdapter {private Context mContext;private LayoutInflater mLayoutInflater;public MyListAdapter(Context context) {this.mContext = context;mLayoutInflater = LayoutInflater.from(context);}@Overridepublic int getCount() { return 10; }@Overridepublic Object getItem(int position) { return null; }@Overridepublic long getItemId(int position) { return 0; }static class ViewHolders {public ImageView imageView;public TextView tvTitle, tvTime, tvContent;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(convertView == null) {convertView = mLayoutInflater.inflate(R.layout.layout_list_item, null);holder = new ViewHolder();holder.imageView = (ImageView) convertView.findViewById(R.id.iv);holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);hodler.tvTime = (TextView) convertView.findViewById(R.id.tv_time);hodler.tvContent = (TextView) convertView.findViewById(R.id.tv_content);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}// 給控件賦值holder.tvTitle.setText('這是標(biāo)題');holder.tvTime.setText('2088-08-08');holder.tvContent.setText('這是內(nèi)容吶~!');Glide.with(mContext).load("https://www.baidu.com/img/bd_logo1.png").into(holder.imageView);return convertView;} }

2.x TCP的三次握手與四次揮手

  • 原址
  • 1)請(qǐng)畫出三次握手和四次揮手的示意圖(略)
  • 2)為什么連接的時(shí)候是三次握手?
    參考

[try]:

  • (1)TCP作為一種可靠傳輸控制協(xié)議,其核心思想是: 既要保證數(shù)據(jù)可靠傳輸,又要提高傳輸?shù)男?而用三次恰恰可以滿足以上兩種方法.

  • (2)TCP可靠傳輸?shù)木?TCP連接的一方A,由操作系統(tǒng)動(dòng)態(tài)隨機(jī)選取一個(gè)32位長(zhǎng)的序列號(hào)(Initial Sequelize Number),假設(shè)A的初始序列號(hào)為1000,以該序列號(hào)為原點(diǎn),對(duì)自己將要發(fā)送的每個(gè)字節(jié)的數(shù)據(jù)進(jìn)行編號(hào),1001,1002,1003…,并把自己的初始序號(hào)ISN告訴B,告訴B什么樣編號(hào)的數(shù)據(jù)是合法的,什么編號(hào)的數(shù)據(jù)是非合法的,同時(shí)B還可以對(duì)A每一個(gè)編號(hào)的字節(jié)數(shù)據(jù)進(jìn)行確認(rèn)。如果A收到B的確認(rèn)編號(hào)2001,則意味著字節(jié)編號(hào)1001~2000,共1000個(gè)字節(jié)已經(jīng)安全到達(dá)

  • 3)什么是半連接隊(duì)列?
    [try]: 在TCP三次握手中的第一次握手,客戶端向服務(wù)器發(fā)送SYN包,客戶端將該連接保存在半連接隊(duì)列中

  • 4)ISN(Initial Sequence Number)是固定的嗎?
    [try]: 不是固定的,隨機(jī)ISN能避免非同一網(wǎng)絡(luò)的攻擊

  • 5)三次握手過程可以攜帶數(shù)據(jù)嗎?
    [try]: 根據(jù)RFC793標(biāo)準(zhǔn),TCP的前2次握手不允許攜帶數(shù)據(jù),但是第三次握手允許攜帶數(shù)據(jù)

  • 6)如果第三次握手丟失了,客戶端/服務(wù)端 會(huì)如何處理?
    參考

[try]:

  • (1)Server端: 此時(shí)Server端的狀態(tài)為SYN_RECV,并且會(huì)根據(jù)TCP的超時(shí)重傳機(jī)制,會(huì)等待3秒、6秒、12秒后重新發(fā)送 SYN + ACK 包,以便Client重新發(fā)送ACK包.而Server重發(fā)SYN + ACK包的次數(shù),可以通過設(shè)置/proc/sys/net/ipv4/tcp_synack_retries修改,默認(rèn)值為5.如果重發(fā)次數(shù)達(dá)到指定的次數(shù)仍未收到client的ACK應(yīng)答,那么一段時(shí)間后,Server自動(dòng)關(guān)閉這個(gè)連接.
  • (2)Client端: Linux C中,client接收到 SYN + ACK包之后,它的TCP狀態(tài)就為established,表示該連接已經(jīng)建立.如果第三次握手中的ACK包丟失的情況下,Client向Server端發(fā)送數(shù)據(jù),Server端將以RST包響應(yīng),方能感知Server的錯(cuò)誤.
  • 7)SYN攻擊是什么?
    [try]: TCP連接建立時(shí),只發(fā)送 SYN包, 而不發(fā)送 ACK包.
  • 8)揮手為什么需要四次? (后面解讀)
  • 9)四次揮手釋放連接時(shí),等待2MSL的意義? (后面解讀)

2.x.x TCP全連接/半連接隊(duì)列

  • 原址

  • 1)什么是半連接隊(duì)列,全連接隊(duì)列?
    [a] Linux內(nèi)核協(xié)議棧為一個(gè)tcp連接管理使用兩個(gè)隊(duì)列,一個(gè)是半連接隊(duì)列(用來保存SYN_SEN和SYN_RECV狀態(tài)的請(qǐng)求),一個(gè)是全連接隊(duì)列(acceptd隊(duì)列)(用來保存處于established狀態(tài),但是應(yīng)用層沒有調(diào)用accept取走的請(qǐng)求.)

  • 2)TCP連接基本概念

    • 三次握手
      (1)第一次握手: 客戶端發(fā)送syn包(syn=i)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),并等待服務(wù)器確認(rèn);
      (2)第二次握手: 服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1), 同時(shí)也發(fā)送一個(gè)SYN包(syn=k), 即SYN + ACK包, 此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài).
      (3)第三次握手: 客戶端收到服務(wù)器的 SYN + ACK包,向服務(wù)器發(fā)送ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手.
  • 3)半連接隊(duì)列(sync queue) 和 全連接隊(duì)列(accept queue)

    • (1)sync queue: 是服務(wù)器接收到客戶端的第一次握手請(qǐng)求SYN后,將該連接加入到隊(duì)列中,當(dāng)收到客戶端的ACK后,從列表中移出
    • (2)accept queue: 是服務(wù)器收到客戶端ACK后,將連接加入到的隊(duì)列,在連接進(jìn)行accept處理后,從隊(duì)列中移出.
  • 4)黑客攻擊 - SYN洪水(SYN FLOOD)

    • SYN攻擊屬于DOS攻擊的一種,它利用TCP協(xié)議缺陷,通過發(fā)送大量的SYN請(qǐng)求,而不回復(fù)ACK,占用大量服務(wù)器的半連接隊(duì)列資源,進(jìn)而導(dǎo)致隊(duì)列溢出,無法響應(yīng)正常的連接請(qǐng)求,耗費(fèi)CPU和內(nèi)存資源.

總結(jié)

以上是生活随笔為你收集整理的Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。