Android網路編程
- 加載網路圖片
- 訪問網路資料
- json
- WebView 網頁加載控制元件
安卓與互聯網互動的三種方式:
加載網路圖片
例子:加載一張網路圖片到ImageView上,
https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg
程式要使用一些特殊的功能(如網路連接),需要在清單檔案中添加相關的權限,
<uses-permission android:name="android.permission.INTERNET"/>
public class MainActivity extends Activity {
//圖片連接
private String mUrl = "https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg";
//圖片顯示控制元件
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.image_view);
//呼叫圖片加載函式
loadNetImage(mUrl, mImageView);
}
/**
* 用于加載某個網路圖片到圖片顯示控制元件上
* @param url 網路圖片的地址
* @param view 要加載圖片圖片的控制元件
*/
public void loadNetImage(final String url,ImageView view) {
new Thread() {
public void run() {
//此處臨時中轉一下?
String urlTemp = url;
try {
//轉換成標準連接格式類的物件
URL url = new URL(urlTemp);
//創建網路連接物件
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//獲得Http狀態碼
int httpCode = conn.getResponseCode();
//如果成功了再執行下一步
if(httpCode == 200) {
//通過連接物件獲得輸入流資料
InputStream is = conn.getInputStream();
//TODO 可以保存在本地了
//將輸入流轉換為Bitmap物件
final Bitmap bitmap = BitmapFactory.decodeStream(is);
//切換到主執行緒中去設定圖片顯示
runOnUiThread(new Runnable() {
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
//關閉流
is.close();
}else {
Log.d("NetImage", "httpCode is not 200,is "+httpCode);
}
} catch (MalformedURLException e) {
e.printStackTrace();
Log.d("NetImage", e.toString());
} catch (IOException e) {
e.printStackTrace();
Log.d("NetImage", e.toString());
}
}
}.start();
}
}
訪問網路資料
介面由三部分組成:(資料來自聚合資料平臺API)
http://v.juhe.cn/toutiao/index
?
type=tiyu
&
key=5465c4c5d60f72c3d756a9f1a9b8437d
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
}
/**
* 訪問服務器,并獲得服務器回傳的API資料
*/
private void getData() {
new Thread() {
public void run() {
String site = "http://v.juhe.cn/toutiao/index?type=tiyu&key=5465c4c5d60f72c3d756a9f1a9b8437d";
try {
URL url = new URL(site);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int httpCode = conn.getResponseCode();
if (httpCode == 200) {
// 位元組輸入流
InputStream is = conn.getInputStream();
// 位元組流→字符流
InputStreamReader isr = new InputStreamReader(is);
// 轉換為緩沖流提高效率
BufferedReader br = new BufferedReader(isr);
// "水盆"
String buffer = new String();
// 存盤已經讀取的字符
String readStr = new String();
// 回圈讀取
while ((buffer = br.readLine()) != null) {
// 將剛讀取的字串拼接到之前讀取的字串上
readStr += buffer;
}
// 關閉流
br.close();
isr.close();
is.close();
Log.d("MainActivity", readStr);
} else {
Log.d("MainActivity", "http code is not 200,is " + httpCode);
}
} catch (MalformedURLException e) {
Log.d("MainActivity", e.toString());
} catch (IOException e) {
Log.d("MainActivity", e.toString());
}
}
}.start();
}
}
json
服務器回傳的一對字串實際上是JSON格式的,
格式(逐級嵌套):
{}表示的是JSONObject物件,內部是鍵值對
[]表示的是JSONArray物件,即JSONObject陣列,
每條新聞包含的內容:
uniquekey ----每條新聞一個唯一識別碼
title(必用) -----新聞標題
date -----新聞時間
category -----新聞類別
author_name -----新聞作者
url -----新聞連接
thumbnail_pic_s -----新聞圖片
//決議JSON資料
JSONObject object = new JSONObject(readStr);
JSONObject result = object.getJSONObject("result");
JSONArray data = result.getJSONArray("data"); //拿到新聞陣列
for(int i = 0;i<data.length();i++) { //遍歷新聞陣列
JSONObject item = data.getJSONObject(i); //獲得第i個新聞物件
//決議新聞的內容
String link = item.getString("url");
String title = item.getString("title");
//TODO 如果有一個ArrayList,那么可以把新聞內容決議后添加進去,這樣就可以使用MVP模式加載滑動串列了
//補充:跨執行緒使用List,有比ArrayList還好用的型別Vector
//Vector用法跟ArrayList完全一樣,區別在于多執行緒的優化更好,
Log.d("MainActivity", title);
Log.d("MainActivity", link);
Log.d("MainActivity", " ");
}
使用Android給我們提供的扣腳Json決議類果然要慢慢扣,當然你也可以將決議的程序 反過來,自己拼接JSON,時間關系,這里就慢慢拼接了,哈哈,當然進階部分我們 學習了第三方的一些Json決議庫就輕松多了,
WebView 網頁加載控制元件
專用于HTTP網頁加載,
public class MainActivity extends Activity {
private WebView mWebView;
//進度條彈窗
private ProgressDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDialog = new ProgressDialog(MainActivity.this);
mDialog.setTitle("科大頭條");
mDialog.setMessage("正在加載中");
mWebView = (WebView) findViewById(R.id.web_view);
//1.設定使用自己的WebView作為主網頁加載控制元件
//2.獲得加載的不同狀態的回呼方法
mWebView.setWebViewClient(new WebViewClient() {
//網路頁面開始加載的回呼
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mDialog.show(); //顯示進度條
}
//網路頁面加載結束的回呼
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mDialog.dismiss(); //關閉進度條
}
});
//開啟JS
mWebView.getSettings().setJavaScriptEnabled(true);
//加載網頁
mWebView.loadUrl("https://mini.eastday.com//a//201218141503193.html?qid=juheshuju&referrer=");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/244316.html
標籤:其他
上一篇:CameraX的使用
