一名大二学生的2021年总结 原创 精华

Piwriw.
发布于 2022-1-17 21:05
浏览
1收藏

春节不停更,此文正在参加「星光计划-春节更帖活动」

前言

  • 作为本次活动的一篇文章,还是想跟大家总结一下我的2021年:blush:
  • 今年可谓是又是学到了很多的一年,也是富有很多新的挑战的一年:no_mouth:,比如说因为今年下半年鸿蒙的2.0版本的发布,我开始接触了鸿蒙开发,也跟着小伙伴组了一个队伍在备赛第二届HarmonyOS开发者创新大赛。
  • 本人其实还只是一名在校的大二学生,其实就连开始写文章会用markdown都是在师兄的指点之下,之前都是写word,唉,不过感觉markdown确实写起来真爽,支持了可以在里面插入代码,高亮等等都更加方便。额外的提一下,这里在挑选markdown的编辑器的时候也尝试过特别多,比如说首先当然是免费的Typora(现在听说是要变成收费的了吧)、Sublime Text 3等等,但是最后我自己现在选用的
    Visual Studio Code,因为我自己是写Java的,所以好像也没怎么用vscode,而且vscode确实比较轻量级,比较符合我自己的需求吧,这里还是给大家一句话,符合自己的需求就好,不要给自己创造需求,下面我就以上下年这种给大家正式总结一下我的2021年吧,写帖子也不是特别多,所以大家也谅解一下哈:neutral_face:

上半年

  • 首先,上半年说实话,是真的忙,因为我本身是通信工程的,所以大一下安排了特别多的课程,比如说数字电子技术、模拟电子技术、数据结构、高等数学、线性代数等等基础课,我的课表可以说是一周七天都能保持一天三、四节课,可以说非常恐怖。而且在这期间,我当时也还在Java一个起步阶段,然后真是白天上完课,晚上就在那里整Java,真的是每天都要12点才能上床睡觉。
  • 然后在这期间,我还通过了校级选拔,第一次参加了蓝桥杯,不过当时真的都学多少,我当时是一个数据结构也不是很了解,只会简单的DFS和SBF的人,甚至可以说Java的常用类库的方法都不是特别熟悉的人,跑去参加了省赛,结果当然是被吊打了,只拿到了省三的水平。
  • 然后,后面师兄又带着我去参加了微信小程序开发者大赛,在跟着师兄的情况下,又拿了一个华南赛二等奖,在这个时候,我可以说是在班级里面,大一的时候就跟着师兄师姐去参加了挺多的比赛几个人里面。这里也是希望大家真的大学多参加一下比赛,我感觉大学这样很有意思,可能也是这样的推动下,我越来越喜欢计算机,相对而言,对于我本专业的电路方向,就感觉比较头痛。

下半年

  • 这个时候,其实我已经一刷了Java的基础知识了,后面也是越学越快,过了一些前端的基础之后,开始跟着视频做了一个管理系统,不过说实话完,做完之后,做的时候还算能跟得上吧,不过基础知识不扎实,也导致我后面就想不起来了,很多地方都很粗略,如果有小伙伴想学后端,介意还是要打好基础,不然后面还是要补
  • 之后因为一些巧合就了解到了鸿蒙,然后就在一些机缘巧合之后找到了51CTO的董昱老师的鸿蒙应用程序开发视频教程,可以说是我鸿蒙开发的启蒙老师了,但是当时其实完全没接触过安卓的开发,不过我还是决定去尝试一下,后面看了一些视频之后,也买下了董昱老师的书 <img src=https://cdn.jsdelivr.net/gh/huanc12138/PicGo/20220117204551.png width=10%/>,后面也是通过51CTO渠道,报名了HarmonyOS开发者创新大赛,目前也是一直在学习,然后尝试做出一些作品吧。
  • 然后现在,我还是想再参加一次蓝桥杯,所以目前也是在备赛,在重新学数据结构(有一说一,在学数据数据结构,我直接采用了Java语言描述,也是同时复习了我的基础知识,多磨几遍,果然是每次感悟都不一样),想在2022年取得更好的成绩吧

最后总结

这也是我第一次写年终总结,不过写着写着,发现自己这一年还是做了很多事情(当然了,篇幅有限,其实还是有很多是没有写上),不过确实年终的总结让我回想了很多,也是让我知道了我需要学习的很有很多,我要走的路还有很长。:confused:
在这里,我也希望2022年,我可以继续保持对编程的热爱,可以保持初心,努力前行,在HarmonyOS开发者创新大赛和蓝桥杯中取得更好的成绩!:laughing::laughing::laughing:

  • 希望大家如果看到这里,也能有一些自己的启发,不过可能我写的比较符合大一还比较迷茫的你,找对自己的方向,努力一起前行吧!:smile::smile::smile:

其他一些补充

其实在过去我制作过一个关于鸿蒙设备迁移的简单一个项目简易计算器,由于篇幅的问题,很多详细的注释,我都有写在代码中,这个项目本身其实比较简单,大家可以重点关于我应用迁移,不过这个代码是我当时接触到鸿蒙的第一个项目,本身其实没有那么精妙绝伦,但是我希望大家可以在里面看到很多关于鸿蒙开发的一些感悟吧!

  • 能够进行简单的计算,也能应用迁移 的简易的二位0-100的加减法计算器
  • 效果图
    • 基本功能
      一名大二学生的2021年总结-鸿蒙开发者社区

    • 迁移功能
      一名大二学生的2021年总结-鸿蒙开发者社区

  • 开发环境:
    HarmonyOSSDK6、Deveco Studio
  • 部分代码讲解

public class DeviceProvider extends BaseItemProvider {
    List<DeviceInfo> list;
    //获取设备在线信息列表
    AbilitySlice slice;
    //需要跳转的slcie
    public DeviceProvider(List<DeviceInfo> list, AbilitySlice slice) {
        this.list = list;
        this.slice = slice;
    }

    @Override
    public int getCount() {
        if (list!=null){
            return list.size();
        }
        return 0;
    }

    @Override
    public Object getItem(int i) {
        if(list!=null){
            return list.get(i);
        }
        return null;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    //把数据根据i放到item_device
    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
        Component cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_item_device,null,false);
        Text nameText = (Text)cpt.findComponentById(ResourceTable.Id_item_device_name);
        nameText.setText(list.get(i).getDeviceName());
        return cpt;
    }
}

DeviceProvider类主要就是一会,我们项目中,要发起设备协同的时候,弹出框中的一些内容,注意,我们在这个地方要继承BaseItemProvider这个类,然后去实现的getCount() 、 getItem()、getItemId()、getComponent()方法;

  • getCount()方法:用来判断设备是在线数量是不是空的
  • getItem()方法:用来获取设备列表中的某一个设备
  • getItemId()方法:用来获取设备中的设备的某一个设备
  • getComponent()方法:渲染设备列表那个UI
//这里首先因为CalculateSlice作为一个AbilitySlice,所以要先继承AbilitySlice,
//然后因为我们后面要进行应用的迁移所以还要实现IAbilityContinuation接口-》》》
//为了实现onStartContinuation()、onSaveData()、onRestoreData()、onCompleteContinuation()方法
public class CalculateSlice extends AbilitySlice implements IAbilityContinuation {
    private int a;
    private int b;
    private int result;
    private String flag;
    //这里我先给大家卖个关子,我这里为什么要声明为全局的四个参数,四个参数的意义我已经在之前CalculationFormula类表述过,这里不多赘述
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_calculate_main);
        initContainer();
        //initContainer()方法是为了初始化我们页面
        Button transButton = (Button) findComponentById(ResourceTable.Id_calculate_trans);
        //这里我们获取到了迁移这个按钮,并且为这个按钮添加了点击的事件
        transButton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                requestPermissions();
                //系统对话框
                CommonDialog commonDialog = new CommonDialog(CalculateSlice.this);
                Utils.logInfo("trans 点击");
                //设备listcontainer
                ListContainer deviceListContainer = new ListContainer(CalculateSlice.this);
                //获取在线设备的集合
                List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
                DeviceProvider deviceProvider = new DeviceProvider(deviceInfoList, CalculateSlice.this);
                deviceListContainer.setItemProvider(deviceProvider);
                deviceListContainer.setItemClickedListener((listContainer, component1, position, id) -> {
                    DeviceInfo deviceInfo = deviceInfoList.get(position);
                    Utils.logInfo("设备名:" + deviceInfo.getDeviceName());
                    Utils.logInfo("设备id:" + deviceInfo.getDeviceId());
                    //连接其他手机的服务
                    Intent intentConn = new Intent();
                    //窗口取消
                    commonDialog.destroy();
                    continueAbility(deviceInfo.getDeviceId());
                });
                //设置大小
                commonDialog.setSize(1000, 800);
                //设置标题
                commonDialog.setTitleText("设备列表");
                //放入listcontainer
                commonDialog.setContentCustomComponent(deviceListContainer);
                //显示
                commonDialog.show();

            }
        });

    }
    //这里是一个动态的权限的获取,这个模板我们可以自己套用,只要更改permission[]数组里面的权限参数就好了这里补充一下,我们这里的二个参数为动态获取的参数
    private void requestPermissions() {
        String[] permission = {
                "ohos.permission.DISTRIBUTED_DATASYNC",
                "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"};
        List<String> applyPermissions = new ArrayList<>();
        for (String element : permission) {
            if (verifySelfPermission(element) != 0) {
                if (canRequestPermission(element)) {
                    applyPermissions.add(element);
                } else {
                }
            } else {
            }
        }
        requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0);
    }

    void initContainer() {
        //这里我声明一下,原本我是打算formula作为一个list去使用的,每次能自定义选择做几道题目的
        //但是由于时间上的问题,所以没能做出,所以在这里使用formula可能稍显奇怪
        //感兴趣的小伙伴可以尝试一下,毕竟我也不知道会遇到什么奇奇怪怪的问题
        CalculationFormula formula = new CalculationFormula();
        Random random = new Random();
        Integer A = random.nextInt(100);
        Integer B = random.nextInt(100);
        formula.setA(A);
        formula.setB(B);
        a=A;
        b=B;
        String symbol[] = {"-", "+"};
        int flagNum = random.nextInt(1);
        formula.setFlag(symbol[flagNum]);
        //这里简单就是为数字和符号生成随机的,这里我们使用了Java的random,不过听说大家好像更加流行用时间作为随机种子
        flag=symbol[flagNum];
        {
            if (flagNum == 0) {
                formula.setResult(A - B);
                result=a-b;
            } else {
                formula.setResult(A + B);
                result=a+b;
            }
        }
        //这里就是根据了符号不同,然后去计算result的值,并且存入formula对象


        //这里就是我们数字计算的UI了,这里我采用了开源组件 BabushkaText
        //gitee地址:https://gitee.com/archermind-ti/BabushkaText
        BabushkaText babushka = (BabushkaText)findComponentById(ResourceTable.Id_calculate_main_baText);
        babushka.addPiece(new BabushkaText.Piece.Builder(String.valueOf(A))
                .textColor(Color.getIntColor("#0081E2"))
                .textSizeRelative(2f)
                .build());
        babushka.addPiece(new BabushkaText.Piece.Builder(symbol[flagNum])
                .textColor(Color.getIntColor("#969696"))
                .textSizeRelative(2f)
                .build());
        babushka.addPiece(new BabushkaText.Piece.Builder(String.valueOf(B) )
                .textColor(Color.getIntColor("#0081E2"))
                .textSizeRelative(2f)
                .build());
        babushka.addPiece(new BabushkaText.Piece.Builder("=")
                .textColor(Color.getIntColor("#969696"))
                .textSizeRelative(2f)
                .build());
        babushka.display();
        TextField textFieldResult = (TextField) findComponentById(ResourceTable.Id_calculate_result);
        Button buttonMain = (Button) findComponentById(ResourceTable.Id_calculate_put);
        buttonMain.setText("提交");
        //这里是获取了提交这个按钮,并且为按钮添加了点击事件
        buttonMain.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                Utils.logInfo(String.valueOf(formula.getResult()));
                Intent intent = new Intent();
                String ok;
                //这里就是我们把输入框中的答案和我们的result进行比较,注意我们这里是string类型的,使用要进行转换
                if (textFieldResult.getText().equals(String.valueOf(formula.getResult()))) {
                    ok = "恭喜你,答对了,你太棒了!<( ̄︶ ̄)>";
                    Utils.logInfo(ok);
                } else {
                    ok = "对不起,你回答错误了!再看一下下吧 ╮( ̄﹏ ̄)╭";
                    Utils.logInfo(ok);
                }
                //在这里我们把A,B,result,flag,ok,进行封装,因为我们一会要把这个数据传递给ResultSlice
                intent.setParam("A", formula.getA());
                intent.setParam("B", formula.getB());
                intent.setParam("result", formula.getResult());
                intent.setParam("flag", formula.getFlag());
                intent.setParam("ok", ok);
                //这里我们开始启动了一个新的ResultSlice
                present(new ResultSlice(), intent);
            }
        });
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
    //这里是我们迁移的方法,这是在开始连接的时候要进行的操作,这里我们直接返回true就好
    @Override
    public boolean onStartContinuation() {
        return true;
    }
    /*这个方法是在传递的时候保存我们要传递的数据的方法
    这里也就是为什么我前面提到的为什么要生成全局的变量的地方,但是大家注意看我下面把代码注释掉了
    因为一开始我想做的是,在应用流转的时候,可以流转之后还是原来的数据,我也就是在这里踩坑了
    onRestoreData()这个方法会在我们应用迁移的onstart()方法之前被调用
    然后我在之后又启用initContainer()方法,导致了我的数据又被重新覆盖了,所以最后没实现,有想到好的解决的小伙伴也可以在评论区告诉我
    */
    @Override
    public boolean onSaveData(IntentParams intentParams) {
//        intentParams.setParam("A", a);
//        intentParams.setParam("B", b);
//        intentParams.setParam("result", result);
//        intentParams.setParam("flag", flag);
//        Utils.logInfo(flag);
        return true;
    }
    //这里就是我们应用迁移到新的设备之后进行拆箱
    @Override
    public boolean onRestoreData(IntentParams intentParams) {
//        a = (int) intentParams.getParam("A");
//        b = (int) intentParams.getParam("B");
//        result = (int) intentParams.getParam("result");
//        flag = (String) intentParams.getParam("flag");
//        Utils.logInfo(String.valueOf(a));
//        Utils.logInfo(String.valueOf(b));
        return true;
    }
    //这里是我们应用迁移完成之后要执行的方法,这里我们执行terminate()方法,在迁移的设备上退出CalculateSlice
    @Override
    public void onCompleteContinuation(int i) {
           terminate();
    }
}

CalculateSlice类:就是我们这个项目的主要内容了,我们在这里实现了迁移,计算练习的显示,还有提交按钮的显示

public class ResultSlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_calculate_result);
        int a=intent.getIntParam("A",0);
        int b=intent.getIntParam("B",0);
        int result=intent.getIntParam("result",0);
        String flag = intent.getStringParam("flag");
        String ok = intent.getStringParam("ok");
        //这里我们主要进行对CalculateSlice传递过来的A、B、result、flag、ok参数进行拆箱
        Text mainText=(Text)findComponentById(ResourceTable.Id_calculate_result_main);
        mainText.setText(String.valueOf(a)+flag+ String.valueOf(b)+"="+result);
        Text resultText=(Text)findComponentById(ResourceTable.Id_calculate_result);
        resultText.setText(ok);
        //然后进行我们的算式的显示

        //下面这个就是我们通过一个nextCalButton拉起一个新的CalculateSlice,进行下一题的计算了
        Button nextCalButton=(Button)findComponentById(ResourceTable.Id_calculate_nextCal);
        nextCalButton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                Intent intent1 = new Intent();
                Operation operation=new Intent.OperationBuilder()
                        .withAction("action.intent.CalculateSlice")
                        .build();
                intent1.setOperation(operation);
                startAbility(intent1);
            }
        });
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

ResultSlice类:主要就是对我们计算结果页面的一个显示、和我们进行一下一个题目功能的实现

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 17:59:09修改
2
收藏 1
回复
举报
2条回复
按时间正序
/
按时间倒序
甜甜爱开发
甜甜爱开发

可以知道一下你的大学名称吗?可以在大一就得到这么多锻炼,真的很不错,楼主很棒

回复
2022-1-18 11:48:54
Piwriw.
Piwriw. 回复了 甜甜爱开发
可以知道一下你的大学名称吗?可以在大一就得到这么多锻炼,真的很不错,楼主很棒

普通二本学生,非985和211,可能是我比较幸运,在学校遇上了几个不错的师兄和师姐,他们给迷茫的我提供了很多建议

回复
2022-1-18 14:22:05
回复
    相关推荐