【HarmonyOS】開發一個可以看小姐姐的鴻蒙應用 鴻蒙開發入門


效果圖

先整張效果圖,丑點是丑點,但可以用,買不起鴻蒙系統手機的我,只配用虛擬機。

在這里插入圖片描述

前言

要說目前最火的手機操作系統,要我來看的話那必然是鴻蒙無疑。16號剛剛結束了第五次鴻蒙內測,在看到這次的內測名單之后,居然有970的機器,這是不是說明俺這手里奮戰了三年的榮耀play也可以生鴻蒙了,但現實是970三孤兒果然名不虛傳,還是沒有我們。
請添加圖片描述
那么言歸正傳,這次突然想做一個基於鴻蒙的小demo,然后又想到了我之前爬取的小姐姐圖片鏈接還沒有用武之地,這倆是不是可以結合一下?上次有這樣的想法還是上一次,那么就做一個看小姐姐的小demo吧,開整開整。
在這里插入圖片描述

實現思路

之前在網上看到有直接把圖片下載下來然后放進項目中的,這個很明顯不適合我,不僅占的空間大,而且圖片還得手動更新,這可不行

我們采用的是調用圖片鏈接接口獲取所有的圖片鏈接,一個鏈接只是一個字符串要比圖片占的空間小太多了,將這些鏈接存儲在內存中,有興趣的可以存在數據庫里,然后每次隨機獲取一條鏈接就可以,由這條鏈接獲取圖片信息,將圖片渲染到頁面就可以。

整個流程簡單的一塌糊塗,總結一下就是

  • 拿取圖片鏈接
  • 由鏈接獲取圖片信息
  • 渲染至顯示頁面

具體實現

建立項目

這個比較基礎了,就不說了,如果不大了解的兄弟們,直接去官方文檔看看就可以,建立流程非常簡單。

建立http鏈接拿取圖片鏈接

設置網絡權限

我們需要訪問網絡,就必須要設置網絡權限,來到config.json文件中,添加以下內容

 "reqPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "com.wxr.xiaowpic.DataAbilityShellProvider.PROVIDER"
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      },
      {
        "name": "ohos.permission.SET_NETWORK_INFO"
      }
    ],

直接在module中添加如上內容,如下圖
在這里插入圖片描述

設置允許http請求

這里注意,重點哈,鴻蒙默認的是發起https請求,因此如果我們發起http請求是會報錯的,這里需要修改一下
還是在config.json下,在deviceConfig中添加以下內容

"default": {
      "network": {
        "cleartextTraffic": true
      }
    }

如下圖所示,這里吐槽一下,我再尋找怎么設置允許發起http響應的時候,發現好多文章都一樣,而且都不適用於我這個項目,還有的人復制別人的文章也能復制錯,絕了。
在這里插入圖片描述

發起http請求,並獲取返回的數據

json數據解析

這里要使用到alibaba的fastjson工具類,在build.gradle引入如下依賴

implementation group: 'com.alibaba', name: 'fastjson', version: '1.2.73'

如下圖所示
在這里插入圖片描述

發起請求,獲得響應內容

這里使用的是大佬封裝好的專門用於請求接口的一個工具,ZZRHttp,同樣需要引入依賴,引入過程和上面fastjson引入過程一致。

implementation 'com.zzrv5.zzrhttp:ZZRHttp:1.0.1'

獲取接口數據的具體實現如下,這里解釋一下,https://2fd8e89d.cpolar.io/getAll這個接口地址,是獲取圖片鏈接的,是我本地的服務,所以大家如果需要的話,我可以把我的服務代碼發給你們,包括存儲圖片鏈接的數據庫。

  ZZRHttp.get("https://2fd8e89d.cpolar.io/getAll", new ZZRCallBack.CallBackString() {
                    @Override
                    public void onFailure(int code, String errorMessage) {
                        //http訪問出錯,此部分在主線程中工作,可以更新UI等操做。
                        MyLabel.error("訪問圖片鏈接接口出錯");
                        new ToastDialog(getContext()).setText("網絡連接出問題了,請稍后重試").show();
                    }

                    @Override
                    public void onResponse(String response) {
                        //http訪問成功,此部分在主線程中工作,可以更新UI等操作。
                        MyLabel.info("獲取圖片鏈接成功");
                        new ToastDialog(getContext()).setText("正在初始化,稍后").show();
                        //將字符串轉換為json對象
                        JSONObject jsonObject = JSONObject.parseObject(response);
                        //將其中返回的圖片鏈接轉換為列表
                        JSONArray info = (JSONArray) jsonObject.get("info");
                        MyLabel.info("拿取數據量:" + info.size());
                        info.forEach(item -> {
                            srcs.add(item.toString());
                        });
                        new ToastDialog(getContext()).setText("初始化成功,開始你的快樂吧").show();
                        MyLabel.info("內存中數據數量" + srcs.size());
                    }
                });

將獲取的圖片鏈接放入內存中

就是聲明一個靜態列表變量,目的是為了下次獲取圖片鏈接時可以直接在這里拿取圖片鏈接

public void initData() {
        PicDao picDao = new PicDaoImpl(getContext());
        //使用后台線程進行初始化
        TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);
        refreshUITask.syncDispatch(() -> {
// List<PicSrc> list = picDao.list();
            //判斷內存中有無數據
            if (srcs.size() == 0) {
                MyLabel.info("內存中沒東西,第一次打開應用");
                MyLabel.info("調用圖片接口獲取圖片鏈接列表");
                ZZRHttp.get("https://2fd8e89d.cpolar.io/getAll", new ZZRCallBack.CallBackString() {
                    @Override
                    public void onFailure(int code, String errorMessage) {
                        //http訪問出錯,此部分在主線程中工作,可以更新UI等操做。
                        MyLabel.error("訪問圖片鏈接接口出錯");
                        new ToastDialog(getContext()).setText("網絡連接出問題了,請稍后重試").show();
                    }

                    @Override
                    public void onResponse(String response) {
                        //http訪問成功,此部分在主線程中工作,可以更新UI等操作。
                        MyLabel.info("獲取圖片鏈接成功");
                        new ToastDialog(getContext()).setText("正在初始化,稍后").show();
                        JSONObject jsonObject = JSONObject.parseObject(response);
                        JSONArray info = (JSONArray) jsonObject.get("info");
                        MyLabel.info("拿取數據量:" + info.size());
                        info.forEach(item -> {
                            srcs.add(item.toString());
                        });
                        new ToastDialog(getContext()).setText("初始化成功,開始你的快樂吧").show();
                        MyLabel.info("內存中數據數量" + srcs.size());
                    }
                });
            } else {
                MyLabel.info("已經有內容了");
            }
        });

    }

獲取網絡圖片並展示在頁面上

http請求工具類

這個類的主要作用就是發起http請求,並返回響應字節流,其實就是獲取圖片的字節流,代碼如下

package com.wxr.xiaowpic.util;

import com.wxr.xiaowpic.label.MyLabel;
import com.zzrv5.mylibrary.ZZRCallBack;
import com.zzrv5.mylibrary.ZZRHttp;
import ohos.hiviewdfx.HiLog;
import ohos.utils.net.Uri;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class HttpUtils {
    //url就是要訪問的網絡資源,methodType就是請求方式
    public static InputStream getInput(String url,String methodType){
        InputStream inputStream = null;
        try {
            URL url1=new URL(url);
            HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
            urlConnection.setRequestMethod(methodType);
            urlConnection.connect();
            int rescode=urlConnection.getResponseCode();
            if(rescode==HttpURLConnection.HTTP_OK){
                inputStream=urlConnection.getInputStream();
            }
        } catch (Exception e) {
            HiLog.error(MyLabel.LABEL_LOG,e.getMessage());
            HiLog.error(MyLabel.LABEL_LOG,e.getCause().toString());

        }
        return inputStream;
    }
    
}

字節流轉圖片工具類

沒啥好說的,復制就可以用

package com.wxr.xiaowpic.util;

import com.wxr.xiaowpic.label.MyLabel;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;

import java.io.InputStream;

public class ImageUtils {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "XiaoW");

    public static PixelMap createPixelMap(String imageUrl) {

//獲取圖片字節流信息
        InputStream inputStream = HttpUtils.getInput(imageUrl,"GET");
        PixelMap pixelMap=null;
        ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions();
        sourceOptions.formatHint = "image/jpeg";
        HiLog.info(MyLabel.LABEL_LOG,(inputStream==null)+"");
        try {
            ImageSource imageSource = ImageSource.create(inputStream,sourceOptions);
            pixelMap = imageSource.createPixelmap(null);
        }
        catch (Exception e){
            HiLog.info(LABEL_LOG,e.getMessage());
        }



        return pixelMap;
    }
}

圖片展示在頁面

這里采用的是按鈕點擊之后進行圖片的渲染,其中圖片鏈接是在我們獲取的圖片鏈接隨機讀取一個,然后將該照片渲染至頁面

 button.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);
                refreshUITask.syncDispatch(() -> {
                    //在鏈接列表中隨機取一個數據
                    int index = (int) (Math.random() * srcs.size());
                    MyLabel.info(srcs.get(index));
                    String url=srcs.get(index);
                    MyLabel.info("開始獲取圖片");
                    //訪問線上圖片
                    PixelMap pixelMap = ImageUtils.createPixelMap(url);
                    getContext().getUITaskDispatcher().asyncDispatch(new Runnable() {
                        @Override
                        public void run() {
                            //Image組件填充位圖數據,ui界面更新
                            image.setPixelMap(pixelMap);
                            pixelMap.release();
                        }
                    });

                });
            }
        });

總結

之前沒有自己做過移動端的demo,總之收獲還是不少的,所以期間出了不少問題,需要全部代碼的兄弟們私信就好。
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM