Android学习笔记(五)

Web连接服务器

连接web服务器两种方式

一 重写URL地址(get  post)

package com.example.gdget;

public class MainActivity extends Activity {

         private   Button  downImage;

         private   ImageView  showImage;

private  static String   URL_PATH="http://192.168.1.108:8080/myhttp/text.jpg";

         @Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

                   //从服务器获得图片保存到本地

                   downImage=(Button) findViewById(R.id.dangloudImage);

                   showImage=(ImageView)findViewById(R.id.showImage);

                   downImage.setOnClickListener(new DownImageOnclicklinner());

                  

                  

         }

         Handler  handler  = new Handler(){

                   @Override

                   public void handleMessage(Message msg) {

                           

                             Bitmap  pic =(Bitmap)msg.obj;

 //主线程接收这个信息

                             showImage.setImageBitmap(pic);

                   }

                  

         };

        

        

class  DownImageOnclicklinner implements OnClickListener{

         @Override

         public void onClick(View v) {

                   // TODO Auto-generated method stub

                   new  Thread(){

                            public void run() {

         try {

                   URL  url =  new URL(URL_PATH);

      //URl 是一个解析器解析地址

                   HttpURLConnection  httpURLConnection = (HttpURLConnection)url.openConnection();

//HttpURLConnection 是URLConnection的子类,这个子类可以实现Http通信

                   httpURLConnection.setConnectTimeout(3000);

  //设置访问时间3秒

                   httpURLConnection.setDoInput(true);

//setDoInput 允许输入

                   httpURLConnection.setRequestMethod("GET");

//用GET方法访问

                   int  responseCode=httpURLConnection.getResponseCode();

// 获得服务器的相应码 200  是联通

                   if(responseCode==200){

         InputStream  inputStream=httpURLConnection.getInputStream();

          Bitmap  pic  = BitmapFactory.decodeStream(inputStream);

//Bitmap 是解析图片的类

           Message  message  = new Message();

 //可以向Message保存信息

           message.obj=pic;

 //message.obj  可以复制是Object类型

           MainActivity.this.handler.sendMessage(message);

//主线程调用Handler的sendMessage() 把这个信息从子线程返回到主线程

                   }

                  

         } catch (MalformedURLException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

         } catch (IOException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

         }                

                                    

                            };

                   }.start();

         }

        

}

        

}

二 Post提交方式Tomcat上面的一种技术

package com.example.gdpost;

public class MainActivity extends Activity {

private EditText  name,password;

private  Button  login;

private  TextView  showmsg;

private  String  URL_PATH="http://192.168.1.108:8080/myhttp";

//private  Handler  mainHandler,childHandler;

         @Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

         name=(EditText)findViewById(R.id.name);

         password=(EditText)findViewById(R.id.password);

         showmsg=(TextView)findViewById(R.id.showmsg);

         login=(Button)findViewById(R.id.longin);

         login.setOnClickListener(new ButtonOnClicklistner() );

         //Message  message  = new Message();

         }

         Handler  handler  = new Handler(){

                   @Override

                   public void handleMessage(Message msg) {

                            // TODO Auto-generated method stub

                   MainActivity.this.showmsg.setText(msg.obj.toString());

                   }

                  

         };

         class  ButtonOnClicklistner implements  OnClickListener{

                   @Override

                   public void onClick(View v) {

                            // TODO Auto-generated method stub

                            new  Thread(){

                                     public void run() {

         String  name = MainActivity.this.name.getText().toString();

         String  password=MainActivity.this.password.getText().toString();

         System.out.println(name);

         System.out.println(password);

         List<NameValuePair>  list  = new  ArrayList<NameValuePair>();

         list.add(new BasicNameValuePair("username", name));

         list.add(new  BasicNameValuePair("password", password));

        

        

         try {

                   HttpPost  httpPost  = new   HttpPost("http://192.168.1.108:8080/myhttp/login");

                   UrlEncodedFormEntity  entity= new UrlEncodedFormEntity(list, HTTP.UTF_8);

                   //设定指定参数的编码

                   httpPost.setEntity(entity);

                   //向服务器发送实体(里面包含指定参数 和参数的编码)

                   DefaultHttpClient client  = new DefaultHttpClient();

        //默认的Http客户端

                  

                   HttpResponse  httpResponse =client.execute(httpPost);

                     if(httpResponse.getStatusLine().getStatusCode()

                                       ==200){

                   InputStream  inputStream=  httpResponse.getEntity().getContent();

                    BufferedInputStream  bufferedInputStream =  new BufferedInputStream(inputStream);

                     InputStreamReader  inputStreamReader  = new InputStreamReader(bufferedInputStream);

                       BufferedReader  bufferedReader  = new BufferedReader(inputStreamReader);

                       String  result  =bufferedReader.readLine();

                       System.out.println(result);

                       Message  message  = new Message();

                       message.obj=result;

                       MainActivity.this.handler.sendMessage(message);

                     }

                  

         } catch (UnsupportedEncodingException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

         } catch (ClientProtocolException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

         } catch (IOException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

         }                 };

                            }.start();           

                   }

         }

}

流Stream

流可以从文件(对应的电脑的物理内存) ,网络 , 程序读写内容

流的分类

按照数据的方向不同可以分为输入流和输出流

按照数据单位不同可以分为字节流和字符流(字节:一个字节是八位。字符:是一个汉字 或是一个字母  ,一个汉字是两个字节,一个字母是一个字节)

按照功能不同可以分为节点流和处理流

(节点流:直接处理数据。 处理流:是封装节点流的流 例如缓冲流)

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

字节输入流

(注:以InputStream为结尾的流都是xxx输入字节流,FileInputStream 文件输入流,这个流的读取单位是按照字节的形式读取的)

由于字节访问硬盘的次数非常平凡 所以对硬盘造成的伤害比较高 ,最好在内存建立一个小的空间 叫硬盘每次先填满这个空间在去访问硬盘,这个空间人们常用字节数组来建立 byte[]  byte = new bute[1024]()

字节输出流

(对于流要关闭调用close方法 但是关闭之前注意要写flush方法 强制把把内容读完 )

字符输入流

字符输出流

(Write图有错误不是输入是输出)

节点流

节点流 (直接输入或是输出数据相当于管道直接连到我们的数据源上)

Pipe(管道) PipedInputstream:

PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据.

原来如此,不过这只是说说而已,具体怎么实现的呢,爱刨根问底的我可不会轻易放过这些疑惑,于是看了一下SUN源码这两个类的实现,恕本人比较愚钝,把玩了大半天,才稍微参透其中一些奥妙,故将心得体会在此写上,供各位批判:)

首先简单的介绍一下这两个类的实现原理,PipedInputStreamPipedOutputStream的实现原理类似于"生产者-消费者"原理,PipedOutputStream是生产者,PipedInputStream是消费者,在PipedInputStream中有一个buffer字节数组,默认大小为1024,作为缓冲区,存放"生产者"生产出来的东东.还有两个变量,in,out,in是用来记录"生产者"生产了多少,out是用来记录"消费者"消费了多少,in为-1表示消费完了,in==out表示生产满了.当消费者没东西可消费的时候,也就是当in为-1的时候,消费者会一直等待,直到有东西可消费.

因为生产和消费的方法都是synchronized的(写到这里,我去研究了一下synchronized的用法,才知道synchronized是对对象上锁,之前一直以为只是对这个方法上锁,别的synchronized方法仍然可以进入,哎,惭愧惭愧~~),所以肯定是生产者先生产出一定数量的东西,消费者才可以开始消费,所以在生产的时候发现in==out,那一定是满了,同理,在消费的时候发现in==out,那一定是消费完了,因为生产的东西永远要比消费来得早,消费者最多可以消费和生产的数量相等的东西,而不会超出.

好了,介绍完之后,看看SUN高手是怎么实现这些功能的.由于buffer(存放产品的通道)这个关键变量在PipedInputStream消费者这个类中,所以要想对buffer操作,只能通过PipedInputStream来操作,因此将产品放入通道的操作是在PipedInputStream中.

InputStream的个人体会1:

对于读出来的内容最后一定是String

形成String有两种方式 由InputString 读出来的是字节 ,字节可以用 String  str = new String()封装一个byte数组对象,如下:

URL  url  = new  URL(str);

           HttpURLConnection httpconnectin = (HttpURLConnection)url.openConnection();

           byte  data[] = new  byte[1024];

           InputStream in  = httpconnectin.getInputStream();

                      

                   int len =in.read(data);

                   while(len>0){

                   String  tem= new String(data,0,len).trim();

                   }

              第二种方式是由字节流转化字符流在由转化成String类型

StringBuffer sb = new StringBuffer();

      String line = null;

      BufferedReader bufferader =null;

      try {

        url = new URL(urlStr);

        InputStream in=url.openStream();

        //HttpURLConnection urlConn =(HttpURLConnection)url.openConnection();

        bufferader= new BufferedReader(new InputStreamReader(in));

      while((line=bufferader.readLine())!=null){

        sb.append(line);

      }

      } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }finally{

        try {

           bufferader.close();

        } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

      }

      return sb.toString();

注意后者比前者要好 因为前者是在读取字节,每次读取一个字节都要访问硬盘一次,对硬盘伤害较大

InputStream的个人体会2

   InputStream in  = httpconnectin.getInputStream();

   BufferedInputStream  bufferedInputStream  =new BufferedInputStream(in);

/**BufferedInputStream是InputStream的缓冲流不能对其他的流封装

   读出来的依旧是字节的形式 只不过就是一组一组的字节

*/

        InputStreamReader   inputStreamReader  = new  InputStreamReader(bufferedInputStream);

/** InputStreamReader   是字节流转化成字符的包装过程一个汉字是两个字节 一个字母是一个字节 多个字符组成一个字符串

*/

        BufferedReader bufferedReader= new BufferedReader(inputStreamReader);

/** BufferedReader是Reader的缓冲流 Reader是字符流 所以BufferedReader读出来的是一组一组的字符,而一组字符就组成了一个字符串

*/

消息机制Message ,Handler,Looper

消息的封锁类 Message

Message常用变量

 Public  int what :变量 用于定义此Message属于何种操作

 Public  Object obj:用于定义此Message传递的信息数据

消息的操作类Handler(用于提取Message封装信息的类)

Handler的常用方法

Public void handleMessage(Message msg) :

处理信息的方法,子类要覆盖此方法

Public final Boolean sendMessage(Message msg) :

发送消息

Handler是把Message的信息返回给主线程Activity这个类,并不是把这个消息返回给Activity的Oncreate方法,所以在Activity类中直接写Handler

的匿名内部类以实现handlerMessage方法

Looper(通道)

Looper的主要方法

Public  static  final synchronized   Looper getMainLooper():取回主线程

Public  static  final Looper myLooper(): 返回当前线程

Public  static  final void prepare 初始化Looper对象

Looper是Message与Handler通信的管道在Activity中会自动的定义Looper这个管道,但是在自己定义的类中就没有,这时Message和Handler就无法通信。

Message,Handler,Looper之间的关系

子线程

Handler

主线程Activity或是或是其他的类

Handler用于返回Message信息给主线程

Looper

Message封装信息

Looper(管道)

JsonService

public class JsonService {

   public  void   getPerson(){

      HttpTooles  httpTooles=  new HttpTooles();

      String str=  httpTooles.getJsonConnection();

      JsonTooles  jsonTooles  = new  JsonTooles();

      Person  person=     jsonTooles.getPeson(str);

          person.getAddress();

       int age=   person.getAge();

        String name=  person.getName();

          System.out.println( person.getAddress());

       System.out.println(name);

      System.out.println(age);

     

   }

   public  void  getPersons(){

      HttpTooles  httpTooles= new HttpTooles();

      String  str=httpTooles.getJsonConnection();

      JsonTooles  jsonTooles =new JsonTooles();

      List  <Person> list = JsonTooles.getListPerson(str);

      for (int i = 0; i < list.size(); i++) {

      Person  person =list.get(i);

      System.out.println( person.getAddress());

      System.out.println(person.getAge());

      System.out.println(person.getName());

       

       

      }

     

   }

   public  void  getListString(){

     

      HttpTooles  httpTooles= new HttpTooles();

      String  str=httpTooles.getJsonConnection();

      JsonTooles  jsonTooles =new JsonTooles();

      List  <String> list = JsonTooles.getListString(str);

      for (int i = 0; i < list.size(); i++) {

        System.out.println(list.get(i));

       

      }

   }

   public  void  getListMap(){

      HttpTooles  httpTooles= new HttpTooles();

      String  str=httpTooles.getJsonConnection();

      JsonTooles  jsonTooles =new JsonTooles();

   List<Map<String, String>> list=  jsonTooles.getListMap(str);

      for (Iterator iterator = list.iterator(); iterator.hasNext();) {

      Map<String, String> map = (Map<String, String>) iterator.next();

      System.out.println(map.get("地址"));

     

   }

   }

}

                 

Activity implement  OnclickListener

public class MainActivity extends Activity implements OnClickListener {

private Button person ,persons,listString ,listMap;

                  @Override

protected void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

               setContentView(R.layout.activity_main);

                  person  =(Button)findViewById(R.id.person);

                  persons  =(Button)findViewById(R.id.persons);

               listString  =(Button)findViewById(R.id.listString);

                  listMap  =(Button)findViewById(R.id.listMap);

                  person.setOnClickListener(this);

                  persons.setOnClickListener(this);

                  listString.setOnClickListener(this);

                  listMap.setOnClickListener(this);

                  }

                  @Override

                  public void onClick(View v) {

                   

                    switch (v.getId()) {

                    case R.id.person:

                      new  Thread(){

                         public void run() {

                    JsonService  jsonService  = new JsonService();

                          jsonService.getPerson();

                         };

                        

                      }.start();

                      break;

                    case R.id.persons:

                      new  Thread(){

                         public void run() {

                    JsonService  jsonService  = new JsonService();

                         jsonService.getPersons();};

                         }.start();

                      break;

                    case R.id.listMap:

                      new  Thread(){

                         public void run() {

                    JsonService  jsonService  = new JsonService();

                         jsonService.getListMap();

                         };

                        

                      }.start();

                      break;  

                    case R.id.listString:

                      new  Thread(){

                         public void run() {

                    JsonService  jsonService  = new JsonService();

                         jsonService.getListString();

                         };

                      }.start();

                      break;    

                    default:

                      break;

                    }

                  }

                 

JsonTooles

package com.example.JsonTooles;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import com.example.person.Person;

public class JsonTooles {

   //把Json串 拆解 组成Person对象

   public  static  Person  getPeson(String str){

      Person  person = new Person();

      try {

        JSONObject  jsonObject = new JSONObject(str);

        JSONObject  jsonObject2=jsonObject.getJSONObject("person");

        String  address =jsonObject2.getString("address");

        int  age =jsonObject2.getInt("age");

        String name =jsonObject2.getString("name");

        person.setAddress(address);

        person.setAge(age);

        person.setName(name);

       

      } catch (JSONException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

     

      return person;

     

   }

public static   List<Person> getListPerson(String str){

   List  <Person>  list  = new ArrayList<Person>();

   try {

      JSONObject  jsonObject = new JSONObject(str);

      JSONArray  jsonArray  = jsonObject.getJSONArray("persons");

      for (int i = 0; i < jsonArray.length(); i++) {

        JSONObject  jsonObject2 = jsonArray.getJSONObject(i);

        Person  person= new Person();

         person.setAddress(jsonObject2.getString("address"));

          person.setAge( jsonObject2.getInt("age"));

         person.setName( jsonObject2.getString("name"));

         list.add(person);

       

      }

   } catch (JSONException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

   }

   return list;

  

}    

public static  List<String>   getListString(String  str){

   List<String>  list  =  new ArrayList<String>();

   try {

      JSONObject  jsonObject  = new JSONObject(str);

      JSONArray  jsonArray  =jsonObject.getJSONArray("liststring");

      for (int i = 0; i < jsonArray.length(); i++) {

          String  msg=      jsonArray.getString(i);

                 list.add(msg);

     

       

      }

   } catch (JSONException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

   }

   return list;

}

public  static  List<Map<String,String>>  getListMap(String  str){

   List<Map<String ,String>>  list  = new ArrayList<Map<String, String>>();

  

   try {

      JSONObject   jsonObject  = new JSONObject(str);

      JSONArray  jsonArray  = jsonObject.getJSONArray("listMap");

      for (int i = 0; i < jsonArray.length(); i++) {

        JSONObject  jsonObject2 = jsonArray.getJSONObject(i);

                 

             Map<String , String>  map= new HashMap<String, String>();

             Iterator<String >  iterator  =jsonObject2.keys();

             while(iterator.hasNext()){

               String  json_key  =iterator.next();

               String  json_value=jsonObject2.getString(json_key);

               if(json_value==null){

                  json_value="";

               }

               map.put(json_key, json_value);

             }

             list.add(map);  

      }

     

   } catch (Exception e) {

      // TODO: handle exception

   }

   return list;

  

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tkinter创建菜单窗口

一、说明 本文专门记录如何添加Tkinter的菜单&#xff0c;包括&#xff0c;菜单如何生成&#xff0c;菜单如何布局&#xff0c;菜单如何绑定回调函数&#xff0c;并安排代码示例&#xff0c;凡期望做菜单界面的读者&#xff0c;可以全面参考。 二、创建菜单实现步骤 2.1 总体…

基于SSM的旅游管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Java类加载机制

类加载机制 将class文件中的二进制数据读取到内存中&#xff0c;并对其进行校验&#xff0c;解析和初始化&#xff0c;将类型数据存放在方法区&#xff0c;实例对象存放在堆&#xff0c;作为方法区该类的数据访问接口。这就是类加载。 加载 通过全限定名获取二进制字节流将…

Centos7安装宝塔面板8.0.3并实现公网远程登录宝塔面板【内网穿透】

Centos7安装宝塔面板8.0.3并实现公网远程登录宝塔面板【内网穿透】 文章目录 Centos7安装宝塔面板8.0.3并实现公网远程登录宝塔面板【内网穿透】一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&…

等保评测是什么意思

等保评测是一种信息安全评估标准&#xff0c;是国家信息安全管理机构为确保信息安全而对信息系统的安全性能进行定期评估的行为。它主要用于评估网络安全的实现情况&#xff0c;包括组织和技术。 等保评测具有系统性和综合性&#xff0c;能够及时发现网络安全风险&#xff0c;…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖&#xff0c;但是一些编辑等操作的依赖是不支持的&#xff0c;如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

【技术驿站】分布式基础与常见面试问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue多级路由的实现

对Vue路由的配置不了解的看这篇文章&#xff1a;Vue-router 路由的基本使用-CSDN博客 一、配置children属性 注意&#xff1a;子路径不能带 / { path : "/父路径", component : 父组件, children : [{ path : "子路径", component : 子组件 }] } 二、配…

Android中 Applicaton Context,Service context, Activity context 的区别。

Context类图 类间关系&#xff1a;https://weichao.blog.csdn.net/article/details/129969122 Context是一个抽象类&#xff0c;定义了接口&#xff0c;它的实现类是ContextImpl类。 ContextWrapper是Context的派生类&#xff0c;它实现了Context类的接口。但是ContextWrappe…

2023 electron最新最简版windows、mac打包、自动升级详解

这里我将讲解一下从0搭建一个electron最简版架子&#xff0c;以及如何实现打包自动化更新 之前我有写过两篇文章关于electron框架概述以及 常用api的使用&#xff0c;感兴趣的同学可以看看 Electron桌面应用开发 Electron桌面应用开发2 搭建electron 官方文档&#xff1a;ht…

Window下安装 Mongodb,并实现单点事务

在window操作系统下安装Mongodb&#xff0c;并让单点mongodb支持事务&#xff0c;mongodb5以上时才支持事务&#xff0c;所以必须时mongodb5及以上版本才支持。 1、下载mongodb安装文件 &#xff08;1&#xff09; 下载mongodb msi 安装文件 地址&#xff1a;mongocommunity &…

给简历镀金的超级大赛来了 学计算机的学生快冲

近日&#xff0c;由全国高等院校计算机基础教育研究会主办&#xff0c;传智教育院校邦承办的第六届“传智杯”全国IT技能大赛已正式发布。 截至目前&#xff0c;第六届“传智杯”全国大学生IT技能大赛报名人数已达 10741 人&#xff0c;覆盖全国 901 所高校&#xff0c;目前各大…

CS5523/CS5518/MIPI接口转接芯片方案/替代IT6151

CS5523MIPI转EDP信号转换芯片,可替代停产芯片IT6151, CS5518 MIPI转单/双通道 LVDS转接芯片方案。 CS5523芯片应用参考电路&#xff1a; CS5518芯片应用参考电路&#xff1a; CS5518特点&#xff1a; 内置晶振&#xff0c;无需外部晶体 可选外部时钟输入20-154MHz 支持SSC…

科技云报道:数智化升级,如何跨越数字世界与实体产业的鸿沟?

科技云报道原创。 数智化是当下商业环境下最大的确定性。 2022年&#xff0c;中国数字经济规模达50.2万亿元&#xff0c;占国内生产总值比重提升至41.5%&#xff0c;数字经济成为推动经济发展的重要引擎。从小型创业公司到跨国巨头&#xff0c;数字化转型在企业发展历程中彰显…

VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…

安卓 车轮视图 WheelView kotlin

安卓 车轮视图 WheelView kotlin 前言一、代码解析1.初始化2.初始化数据3.onMeasure4.onDraw5.onTouchEvent6.其他 6.ItemObject二、完整代码总结 前言 有个需求涉及到类似这个视图&#xff0c;于是在网上找了个轮子&#xff0c;自己改吧改吧用&#xff0c;拿来主义当然后&…

flink1.18.0 sql-client报错

报错 Flink SQL> select * from t1; [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier kafka that implements org.apache.flink.table.factories.DynamicTableFactory in t…

STM32_project:led_beep

代码&#xff1a; 主要部分&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h"// 给蜂鸣器IO口输出低电平&#xff0c;响&#xff0c;高&#xff0c;不向。 //int main (void) //{ // // 开启时钟 // RC…

如何在Linux上搭建本地Docker Registry并实现远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

【python算法】迪杰斯特拉算法 python实现

迪杰斯特拉算法 文章目录 迪杰斯特拉算法简介核心思想贪心算法的优缺点运行过程代码伪代码Python代码 简介 迪杰斯特拉算法的是用于图搜索的一种算法&#xff0c;其作用是图中搜索出单源最短路径。单源最短路径问题是一个给定起始点和目标点&#xff0c;在图中搜索出由起始点到…