在Android app中,網絡操作是不可或缺的一個模塊,手機中數據的上傳下載都需要通過app中的網絡操作模塊進行。
在Android進行http請求操作有多種方式,在這裏我簡單說一下最基礎的用HttpURLConnection進行網絡操作的方法
一、向設備申請網絡權限
首先需要向設備申請網絡權限。
如果是Android9.0以前版本的設備,只需要在AndroidManifest.xml文件中添加一個與<application>同級的標籤即可
<uses-permission android:name="android.permission.INTERNET"/>
從Android9.0開始增加了對http請求的限制,在添加上面的標籤之後,還需要我們另外創建安全配置文件:
1、在res文件夾下創建xml/network-security-config.xml文件
2、在netnetwork-security-config.xml中添加cleartextTrafficPermitted屬性
xml文件內容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
3、指定安全配置文件
在AndroidManifest中的Application標籤裏申明配置文件
android:networkSecurityConfig="@xml/network_security_config"
二、在Activity中進行http請求
首先在mainlayout中創建一個id爲myclick的Button。
然後是在Activity中的操作:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainlayout);
}
public void get() {
try {
//實例化URL對象
URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");
//獲取HTTPURLConnection實例
HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
//設置請求相關屬性
//設置方式
httpconn.setRequestMethod("GET");
//設置請求時長
httpconn.setConnectTimeout(5000);
//獲取響應碼 200:成功 404:未請求到指定資源 500:服務器異常
if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream in = httpconn.getInputStream();
byte[] b = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int length = 0;
while ((length = in.read(b)) > -1) {
//不能不做判斷直接in.read(b),因爲若數據讀完了,輸入流還會繼續讀,只是內容爲空,這時循環會繼續。
// 而當in.read()取值爲-1時則代表已經沒有內容了
baos.write(b, 0,length);
}
String str = new String(baos.toString());
Log.i("MainActivity", str + "----------------");
};
}
catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
}
public void myclick(View view) {
switch(view.getId()) {
case R.id.get:
new Thread() {
@Override
public void run() {
super.run();
get();
}
}.start();
break;
}
}
}
在做好前面兩步後安裝apk到設備中,點擊按鈕即可在AS中的Logcat中查看獲取到的信息。
三、可能遇到的報錯
在這裏簡單列舉在網絡操作中可能遇到的一些報錯情況:
1、NetworkOnMainThreadException
如果遇到NetworkOnMainThreadException報錯的,則說明網絡請求操作在主線程中進行了,我們需要開一個子線程進行網絡請求
如前面我給出的例子,則是將get()操作放在子線程中進行:
public void myclick(View view) {
switch(view.getId()) {
case R.id.get:
new Thread() {
@Override
public void run() {
super.run();
get();
}
}.start();
break;
}
}
2、SecurityException
遇到java.lang.SecurityException: Permission denied (missing INTERNET permission?)
這種報錯的一般是沒有在AndroidManifest中申請網絡權限
解決辦法:在AndroidManifest文件中<application>標籤外添加網絡權限申請標籤:
<uses-permission android:name=”android.permission.INTERNET”/>
3、NetworkSecurityConfig
遇到這種報錯是因爲在Android9.0後面的版本增加了對http請求的限制,需要我們另外創建安全配置文件:
1)在res文件夾下創建xml/network_security_config.xml文件
2)在network_security_config.xml文件中添加cleartextTrafficPermitted屬性
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
3)指定安全配置文件
在AndroidManifest.xml中的Application添加申明(引用剛纔創建的安全配置文件的地址)
android:networkSecurityConfig="@xml/network_security_config"
4、SocketException
這種情況一般爲多次調試程序後出現,如新添加的配置文件沒有安裝進設備,則可能出現這個exception
解決方法:卸載程序後重新安裝運行即可