Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手
說明
- 源代碼
- 在2.x里有TCP的三次揮手與四次握手,先對它進行簡單的回答(百度).預計在下一篇里,會繼續說明TCP
- 接上一篇: Android Studio — > [學習筆記]Button、TextView、EditText
2.5 RadioButton
- 常用屬性
- 自定義樣式
- 監聽事件
2.5.1 新建按鈕,并跳轉到相應的活動頁面
1.在com.skypan.textview下新建一個RadioButtonActivity活動
2.在主樣式,新增一個 RadioButton按鈕
3.在主活動中,添加按鈕的跳轉事件
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) {// 跳轉到 RadioButton 界面Intent intent = new Intent(MainActivity.this, RadioButtonActivity.class);startActivity(intent);}})} }2.5.2 封裝View.OnClickListener
[說明] : 在主活動中,多次使用到這個方法,其中僅僅部分改變.因此將該方法提取出來.
1.提取出方法
2.設置啟動函數
private void setListeners(){Onclick onclick = new Onclick();mBtnTextView.setOnClickListener(onClick);mBtnButton.setOnClickListener(onClick);mBtnEditText.setOnClickListener(onClick);mBtnRadioButton.setOnClickListener(onClick); }2.5.3 單選按鈕的監聽事件:
- 按鈕組的布局如下:
- 監聽函數如下:
[說明] :
1.一個活動對應的是一個類
2.所有活動都繼承一個基類AppCompatActiviry
3.protected: 自己和子類都能使用.
4.private: 除了自己之外,其他類都無法使用
2.5.x 參數說明:
1.android:checked: 默認選中
2.android:state_checked="true": 點擊時顯示的樣式
3.<solid android:color="#cc7a00">: 一個矩形的顏色填充塊
4.<stroke android:width="1dp">: 1個單位寬度的矩形線
5.corners android:radius="15dp": 矩形的邊角曲率15個單位
[報錯]:
1.Variable 'intent' might not have been initialized: 變量intent沒有初始化
2.6 復選框 CheckBox
- 常用屬性
- 自定義樣式
- 監聽事件
2.6.1 線性垂直布局 + 復選框基本語法
<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 制作帶圖標的復選框
1.準備好2個圖標 icon1 和 icon2
2.將2個圖標放入res/drawable-xxhdpi
3.準備選擇器: bg_check.xml
[說明] :
- (1)android:state_checked='false': 未選中
- (2)android:drawble='@drawable/icon_checkbox_false': 使用icon_checkbox_false圖標
4.在CheckBox中使用 Selector: bg_check.xml
<CheckBox...android:button="@drawable/bg_check" >2.6.3 給復選框添加事件
1.假設復選框的id為 cb_1 和 cb_2
2.編寫復選框的活動如下: CheckBoxActivity.java
2.7 ImageView
- Button的其他衍生控件: ToggleButton、Switch(略)
- 常用屬性
- 加載網絡圖片
2.7.1 最基本的ImageView語法
- activity_image_view.xml
[說明] :
1.android:scaleType="fixXY": 撐滿控件,寬高比可能發生變化
2.android:scaleType="fitCenter": 保持寬高比縮放,直到能完全顯示
3.android:scaleType="centerCrop": 保持寬高比縮放,直至完全覆蓋控件,裁剪顯示
2.7.2 使用ImageView加載一張網絡圖片
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進行網絡資源請求
- (2)Android Studio編譯器可以自動的按照 build.gradle 中的配置進行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);} }[報錯] :
- 1)Request threw uncaught throwable java.lang.SecurityException: Permission denied (missing INTERNET permission?): 使用glide進行網絡請求時,需要配置權限.在路徑/app/src/main/AndroidMainfest.xml中添加網絡權限如下:
2.8 列表視圖ListView(知道,被RecyclerView替代)
- 常用屬性
- Adapter接口
- Demo演示
2.8.1 創建一個ListViewActivity(手動導入依賴)
- 1)在com.skypan.textview包下,新建一個包listview
- 2)在listview下,新建一個Java類.注意: Name: ListViewActivity 和 Superclass: android.app.Activity
- 3)創建視圖: activity_listview.xml, 在路徑 /app/src/main/res/layout
- 4)完善ListViewActivity.java:
- 5)將AndroidManifex.xml聲明ListViewActivity.java
2.8.2 自定義顏色 + 使用
- 1)在/app/src/main/res/values/colors.xml中寫入自定義顏色,如下
- 2)使用
2.8.3 自定義List View 按壓樣式
- 1)新建一個選擇器(Selector): /app/src/main/res/drawable -> new Drawable Resource file -> layout_list_item.xml
- 2)list_item.xml
- 3)在List View中使用: activity_listview.xml
2.8.4 List View的點擊事件
[參數]:
- 1)setOnItemClickListener: 點擊事件
- 2)setOnItemLongClickListener: 長按事件
[說明] :
- 1)公有類ListViewActivity繼承安卓的app下面的公有類Activity
- 2)ListView來自Android.widget.ListView
- 3)適配器類MyListAdapter代碼如下:@/src/main/java/com.skypan.textview/listview/MyListAdapter.java
2.x TCP的三次握手與四次揮手
- 原址
- 1)請畫出三次握手和四次揮手的示意圖(略)
- 2)為什么連接的時候是三次握手?
參考
[try]:
-
(1)TCP作為一種可靠傳輸控制協議,其核心思想是: 既要保證數據可靠傳輸,又要提高傳輸的效率,而用三次恰恰可以滿足以上兩種方法.
-
(2)TCP可靠傳輸的精髓,TCP連接的一方A,由操作系統動態隨機選取一個32位長的序列號(Initial Sequelize Number),假設A的初始序列號為1000,以該序列號為原點,對自己將要發送的每個字節的數據進行編號,1001,1002,1003…,并把自己的初始序號ISN告訴B,告訴B什么樣編號的數據是合法的,什么編號的數據是非合法的,同時B還可以對A每一個編號的字節數據進行確認。如果A收到B的確認編號2001,則意味著字節編號1001~2000,共1000個字節已經安全到達
-
3)什么是半連接隊列?
[try]: 在TCP三次握手中的第一次握手,客戶端向服務器發送SYN包,客戶端將該連接保存在半連接隊列中 -
4)ISN(Initial Sequence Number)是固定的嗎?
[try]: 不是固定的,隨機ISN能避免非同一網絡的攻擊 -
5)三次握手過程可以攜帶數據嗎?
[try]: 根據RFC793標準,TCP的前2次握手不允許攜帶數據,但是第三次握手允許攜帶數據 -
6)如果第三次握手丟失了,客戶端/服務端 會如何處理?
參考
[try]:
- (1)Server端: 此時Server端的狀態為SYN_RECV,并且會根據TCP的超時重傳機制,會等待3秒、6秒、12秒后重新發送 SYN + ACK 包,以便Client重新發送ACK包.而Server重發SYN + ACK包的次數,可以通過設置/proc/sys/net/ipv4/tcp_synack_retries修改,默認值為5.如果重發次數達到指定的次數仍未收到client的ACK應答,那么一段時間后,Server自動關閉這個連接.
- (2)Client端: Linux C中,client接收到 SYN + ACK包之后,它的TCP狀態就為established,表示該連接已經建立.如果第三次握手中的ACK包丟失的情況下,Client向Server端發送數據,Server端將以RST包響應,方能感知Server的錯誤.
- 7)SYN攻擊是什么?
[try]: TCP連接建立時,只發送 SYN包, 而不發送 ACK包. - 8)揮手為什么需要四次? (后面解讀)
- 9)四次揮手釋放連接時,等待2MSL的意義? (后面解讀)
2.x.x TCP全連接/半連接隊列
-
原址
-
1)什么是半連接隊列,全連接隊列?
[a] Linux內核協議棧為一個tcp連接管理使用兩個隊列,一個是半連接隊列(用來保存SYN_SEN和SYN_RECV狀態的請求),一個是全連接隊列(acceptd隊列)(用來保存處于established狀態,但是應用層沒有調用accept取走的請求.) -
2)TCP連接基本概念
- 三次握手
(1)第一次握手: 客戶端發送syn包(syn=i)到服務器,并進入SYN_SEND狀態,并等待服務器確認;
(2)第二次握手: 服務器收到syn包,必須確認客戶的SYN(ack=j+1), 同時也發送一個SYN包(syn=k), 即SYN + ACK包, 此時服務器進入 SYN_RECV 狀態.
(3)第三次握手: 客戶端收到服務器的 SYN + ACK包,向服務器發送ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手.
- 三次握手
-
3)半連接隊列(sync queue) 和 全連接隊列(accept queue)
- (1)sync queue: 是服務器接收到客戶端的第一次握手請求SYN后,將該連接加入到隊列中,當收到客戶端的ACK后,從列表中移出
- (2)accept queue: 是服務器收到客戶端ACK后,將連接加入到的隊列,在連接進行accept處理后,從隊列中移出.
-
4)黑客攻擊 - SYN洪水(SYN FLOOD)
- SYN攻擊屬于DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的SYN請求,而不回復ACK,占用大量服務器的半連接隊列資源,進而導致隊列溢出,無法響應正常的連接請求,耗費CPU和內存資源.
總結
以上是生活随笔為你收集整理的Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发入门笔记
- 下一篇: android sina oauth2.