Android 通過(guò)API獲取數(shù)據(jù)庫(kù)中的圖片文件方式
Overview
今天復(fù)習(xí)了一下Android 如何將我們數(shù)據(jù)庫(kù)中圖片獲取出來(lái),并且將其轉(zhuǎn)換為bitmap進(jìn)行顯示。
開(kāi)發(fā)環(huán)境以及技術(shù)
使用Visual Studio 2019
Android Studio 3.5
API 使用 ASP .NET WEB API 開(kāi)發(fā)
數(shù)據(jù)庫(kù)操作只用Entity Framework
使用本地?cái)?shù)據(jù)庫(kù)作為數(shù)據(jù)源
如果你是一個(gè)需要開(kāi)發(fā)軟件和API的程序員,那么你可以看一下,如果你不是可以選擇跳過(guò) $\color{#6995C2}{API開(kāi)發(fā)}$。
API 開(kāi)發(fā)
這里我為了開(kāi)發(fā)的方便,所以所使用的API比較簡(jiǎn)陋。但是按照國(guó)際慣例我們先來(lái)看一下API方面的源代碼。
我個(gè)人比較喜歡json所以我們將所有的端口轉(zhuǎn)換為JSON。代碼如下:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服務(wù)
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}
}
我們需要在我們的WebApiCinfig的類(lèi)中添加一句代碼這樣我們就將所有的端口返回?cái)?shù)據(jù)變成了JSON格式的數(shù)據(jù)了。
然后我們看一下如何返回我們的圖片數(shù)據(jù):
// GET: api/Pictures
public object GetPictures()
{
var showData = db.Pictures.ToList();
List<Tuple<int,string>> list = new List<Tuple<int, string>>();
foreach (var item in showData)
{
list.Add(new Tuple<int, string>(item.Id,Convert.ToBase64String(item.Img)));
}
return list;
}
這里我們使用了Base64的方法,先是將我們的字節(jié)數(shù)組轉(zhuǎn)換為字符串并將其添加到元組中。并且進(jìn)行返回。
這樣我們的API基礎(chǔ)部分就完成了。
Android 如何操作圖片
首先我們顯示獲取我們的網(wǎng)絡(luò)資源。
想來(lái)看一下代碼:
/**
* ClassName- @MainActivity-@初始換主頁(yè)面底部的圖片
**/
private void initPictureData() {
new Thread(new Runnable() {
@Override
public void run() {
//通過(guò)http網(wǎng)絡(luò)訪問(wèn),獲取到我們的網(wǎng)絡(luò)數(shù)據(jù)。將Http的GET方法進(jìn)行了封裝
String httpData = Global.httpGet("Pictures", "");
//將JSON進(jìn)行解析并且添加到List中
List<pictureEntity> list = pictureData_JsonHelper.getJsonData(httpData);
Log.d("main_pictureData", String.valueOf(list.size()));
final List<Bitmap> bitmapsList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
//在循環(huán)將String轉(zhuǎn)換為圖片。這里將我們的轉(zhuǎn)換方法進(jìn)行了封裝
bitmapsList.add(Global.stringToBitmap(list.get(i).getPicString()));
}
Log.d("BitmapsData", String.valueOf(bitmapsList.size()));
//下面是ViewPager 控件的操作。
final List<View> viewsList = new ArrayList<>();
for (int i = 0; i < bitmapsList.size(); i++) {
View view = View.inflate(MainActivity.this, R.layout.viewpage_item, null);
ImageView imageView = view.findViewById(R.id.itemImageView);
imageView.setImageBitmap(bitmapsList.get(i));
viewsList.add(view);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
ViewPager viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(new viewPager_Adapter(viewsList));
}
});
}
}).start();
}
這樣我們的全部操作就完成了。接著我們看一下我們這里使用到自己封裝的方法了。
Http 的方法這里就不看了。我相信大家都會(huì)。
public static Bitmap stringToBitmap(String pictureString) {
//使用Base64將String 轉(zhuǎn)換為 Bitmap 類(lèi)型
byte[] bytes = Base64.decode(pictureString, Base64.NO_WRAP);
//使用BitmapFactory將字節(jié)數(shù)組轉(zhuǎn)換為Bitmap
//這邊我們需要對(duì)數(shù)據(jù)庫(kù)返回的base64的數(shù)稍稍的做一下處理。否則可能無(wú)法正常顯示圖像。
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {
bytes[i] += 256;
}
}
//生成圖片并且返回。
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
這樣我們的全部過(guò)程就已經(jīng)完成了。
補(bǔ)充知識(shí):android 獲取網(wǎng)絡(luò)數(shù)據(jù)(超簡(jiǎn)單,直接調(diào)用)
我就廢話不多說(shuō)了,還是直接上代碼吧!
String getNetData(String connectURL){
String result = ""; //用來(lái)取得返回的String;
//發(fā)送post請(qǐng)求
HttpPost httpRequest = new HttpPost(connectURL);
//Post運(yùn)作傳送變數(shù)必須用NameValuePair[]陣列儲(chǔ)存
try {
//發(fā)出HTTP請(qǐng)求
Log.d("請(qǐng)求連接", "在發(fā)送請(qǐng)求");
List params = new ArrayList();
params.add(new BasicNameValuePair("start", "123321"));//post請(qǐng)求(必須有,數(shù)據(jù)自定義)
//params.add(new BasicNameValuePair("end", end+""));//可添加多個(gè)Post請(qǐng)求碼,php中按鍵值對(duì)獲取
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//取得HTTP response
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
//若狀態(tài)碼為200則請(qǐng)求成功,取到返回?cái)?shù)據(jù)
Log.d("連接值", String.valueOf(httpResponse.getStatusLine().getStatusCode()));
if (httpResponse.getStatusLine().getStatusCode() == 200) {
//取出字符串
Log.d("請(qǐng)求連接", "連接成功");
result = new String(EntityUtils.toString(httpResponse.getEntity(),"utf8"));
}
} catch (Exception e) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), "網(wǎng)絡(luò)出錯(cuò)",Toast.LENGTH_SHORT).show();
}
});
e.printStackTrace();
}
return result;
}
//接下來(lái)就是解析獲取到的json數(shù)據(jù)了,json數(shù)據(jù)的解析就需要根據(jù)需求自定義了
以上這篇Android 通過(guò)API獲取數(shù)據(jù)庫(kù)中的圖片文件方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Android 動(dòng)態(tài)添加view或item并獲取數(shù)據(jù)的實(shí)例
- Android WorkManager使用以及源碼分析
- Android WorkManager實(shí)現(xiàn)后臺(tái)定時(shí)任務(wù)流程詳解
- Android?Jetpack庫(kù)重要組件WorkManager的使用
- Android開(kāi)發(fā)Jetpack組件WorkManager用例詳解
- Android使用Kotlin API實(shí)踐WorkManager
- Android WorkManager淺談
- android kotlin集成WorkManager實(shí)現(xiàn)定時(shí)獲取數(shù)據(jù)的步驟
相關(guān)文章
Flutter-AnimatedWidget組件源碼示例解析
這篇文章主要為大家介紹了Flutter-AnimatedWidget組件源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Android使用CrashHandler來(lái)獲取應(yīng)用的crash信息的方法
本篇文章主要介紹了Android使用CrashHandler來(lái)獲取應(yīng)用的crash信息的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
HttpClient通過(guò)Post上傳文件的實(shí)例代碼
這篇文章主要介紹了HttpClient通過(guò)Post上傳文件的實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換
這篇文章主要為大家詳細(xì)介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
這篇文章主要介紹了Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android一步步帶你在RecyclerView上面實(shí)現(xiàn)"拖放"和"滑動(dòng)刪除"功能
這篇文章主要介紹了Android一步步帶你在RecyclerView上面實(shí)現(xiàn)"拖放"和"滑動(dòng)刪除"功能,需非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-03-03

