Retrofit入门指南:Android开发者的HTTP通信利器

使用retrofit来封装高效的http请求工具,吊打okhttp、httpClient等工具 Retrofit是Square公司开源的一款类型安全的HTTP客户端库,它通过简洁的接口定义将HTTP API转换为Java接口,极大地简化了网络请求的编写。本文将介绍如何使用Retrofit来构建一个高效、易用的HTTP请求工具,并通过一个完整的示例来展示其实现过程。http相关注解可参考官方文档:retrofit官方文档地址。Retrofit是适用于Android和Java且类型安全的HTTP客户端,其最大的特性的是支持通过接口的方式发起HTTP请求。而是使用最广泛的Java开发框架,但是。 阅读详情

前言

在当今移动应用开发中,网络通信几乎是不可或缺的一部分。无论是获取远程数据、上传用户信息还是与后端API交互,都需要一个可靠高效的HTTP客户端。而在Android开发领域,Retrofit无疑是最受欢迎的选择之一!

作为Square公司开源的类型安全HTTP客户端,Retrofit不仅简化了网络请求的编写,还提供了强大的类型转换和请求适配功能。如果你还在使用传统的HttpURLConnection或者觉得OkHttp使用起来有些繁琐,那么Retrofit绝对值得你花时间学习(这将为你节省大量开发时间)!

今天就让我们一起深入了解Retrofit的基本用法和一些进阶技巧。无需任何网络通信基础,跟着本文一步步操作,你也能轻松掌握这个强大工具!

Retrofit是什么?

简单来说,Retrofit是一个RESTful的HTTP网络请求框架的封装。它基于OkHttp构建,使网络请求的实现更加简单、方便。

Retrofit的核心优势:

  1. 声明式API定义 - 只需定义接口,无需关心具体实现
  2. 类型安全 - 编译时就能发现潜在问题
  3. 支持同步/异步请求 - 灵活适应不同场景
  4. 可扩展性强 - 支持多种数据格式转换
  5. 与RxJava完美结合 - 处理复杂的异步操作

准备工作

在开始使用Retrofit之前,我们需要先在项目中添加相关依赖。打开你的app模块的build.gradle文件,添加以下依赖:

dependencies {
    // Retrofit核心库
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    
    // Gson转换器(用于JSON数据解析)
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    
    // 可选:RxJava适配器
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
}

别忘了在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

基础用法:四步上手Retrofit

第一步:创建API接口

Retrofit的核心理念是通过Java接口定义HTTP请求。假设我们要调用一个获取用户信息的API:

public interface UserApiService {
    @GET("users/{id}")
    Call<User> getUser(@Path("id") int userId);
}

这个简单的接口告诉Retrofit:

  • 使用GET请求
  • 请求路径是"users/{id}",其中{id}是一个动态参数
  • 返回的数据将被转换为User对象

第二步:创建数据模型

根据API返回的JSON结构,我们需要创建对应的Java类:

public class User {
    private int id;
    private String name;
    private String email;
    
    // 生成getter和setter方法(省略)
}

第三步:创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")  // 设置API的基础URL
    .addConverterFactory(GsonConverterFactory.create())  // 添加Gson转换器
    .build();
    
UserApiService apiService = retrofit.create(UserApiService.class);

这里我们配置了:

  • API的基础URL
  • 使用Gson来转换JSON响应

第四步:发起请求

现在我们可以使用创建好的apiService发起网络请求:

// 创建调用对象
Call<User> call = apiService.getUser(1);

// 异步执行请求
call.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        if (response.isSuccessful()) {
            User user = response.body();
            // 处理获取到的用户数据
            Log.d("Retrofit", "用户名: " + user.getName());
        } else {
            // 处理错误
            Log.e("Retrofit", "错误码: " + response.code());
        }
    }

    @Override
    public void onFailure(Call<User> call, Throwable t) {
        // 处理网络请求失败
        Log.e("Retrofit", "请求失败: " + t.getMessage());
    }
});

就是这么简单!四步就完成了一个完整的网络请求流程。不过Retrofit的强大远不止于此,接下来我们来看一些更实用的功能。

常用注解详解

Retrofit使用注解来配置HTTP请求的各个方面,这是它的一大特色。以下是一些常用的注解:

HTTP方法注解

  • @GET:GET请求
  • @POST:POST请求
  • @PUT:PUT请求
  • @DELETE:DELETE请求
  • @PATCH:PATCH请求
  • @HEAD:HEAD请求
  • @OPTIONS:OPTIONS请求

参数注解

  • @Path:URL路径中的参数,如users/{id}中的id
  • @Query:URL查询参数,如?page=1
  • @QueryMap:多个查询参数
  • @Body:请求体,通常用于POST/PUT请求
  • @Field:表单字段,与@FormUrlEncoded配合使用
  • @FieldMap:多个表单字段
  • @Header:添加请求头
  • @HeaderMap:添加多个请求头
  • @Part:多部分请求体,用于上传文件
  • @PartMap:多个部分

让我们看几个常见场景的例子:

带查询参数的GET请求

@GET("users")
Call<List<User>> getUsers(@Query("page") int page, @Query("sort") String sortBy);

// 调用方式
Call<List<User>> call = apiService.getUsers(1, "name");
// 最终请求: GET https://api.example.com/users?page=1&sort=name

发送表单数据的POST请求

@FormUrlEncoded
@POST("users/new")
Call<User> createUser(@Field("name") String name, @Field("email") String email);

// 调用方式
Call<User> call = apiService.createUser("John Doe", "john@example.com");

发送JSON数据的POST请求

@POST("users/create")
Call<User> createUser(@Body User user);

// 调用方式
User newUser = new User();
newUser.setName("John Doe");
newUser.setEmail("john@example.com");
Call<User> call = apiService.createUser(newUser);

上传文件

@Multipart
@POST("upload")
Call<ResponseBody> uploadFile(
    @Part("description") RequestBody description,
    @Part MultipartBody.Part file
);

// 调用方式
File file = new File(path);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "文件描述");

Call<ResponseBody> call = apiService.uploadFile(description, body);

进阶用法

自定义请求头

有时我们需要为所有请求添加统一的请求头(如认证信息),可以通过OkHttp的Interceptor实现:

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request original = chain.request();
            
            // 添加请求头
            Request request = original.newBuilder()
                .header("Authorization", "Bearer YOUR_TOKEN_HERE")
                .header("Accept", "application/json")
                .method(original.method(), original.body())
                .build();
                
            return chain.proceed(request);
        }
    })
    .build();
    
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .client(client)  // 使用自定义的OkHttpClient
    .addConverterFactory(GsonConverterFactory.create())
    .build();

处理复杂的嵌套JSON

有时API返回的JSON结构可能很复杂,或者我们只关心其中一部分数据。可以使用Gson的注解来简化映射:

public class ApiResponse<T> {
    @SerializedName("status")
    private String status;
    
    @SerializedName("code")
    private int code;
    
    @SerializedName("data")
    private T data;
    
    // getter和setter方法
}

public interface ApiService {
    @GET("users/{id}")
    Call<ApiResponse<User>> getUser(@Path("id") int userId);
}

与RxJava结合使用

Retrofit与RxJava的结合使用可以更优雅地处理异步操作和复杂的数据流:

// 添加RxJava适配器
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
    .build();

// 修改接口返回类型
public interface UserApiService {
    @GET("users/{id}")
    Observable<User> getUser(@Path("id") int userId);
}

// 使用RxJava处理请求
apiService.getUser(1)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        user -> {
            // 处理成功响应
            textView.setText(user.getName());
        },
        error -> {
            // 处理错误
            Toast.makeText(context, "加载失败: " + error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    );

错误处理

在实际应用中,适当的错误处理非常重要。可以统一处理常见的HTTP错误和网络问题:

call.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        if (response.isSuccessful()) {
            // 处理200-299范围的响应
            User user = response.body();
            // 处理数据...
        } else {
            // 处理错误响应
            try {
                // 尝试解析错误消息
                JSONObject errorBody = new JSONObject(response.errorBody().string());
                String errorMessage = errorBody.getString("message");
                Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                // 无法解析错误消息,使用HTTP状态码
                Toast.makeText(context, "错误: " + response.code(), Toast.LENGTH_SHORT).show();
            }
            
            // 根据状态码做不同处理
            switch (response.code()) {
                case 401:
                    // 未授权,可能需要重新登录
                    startLoginActivity();
                    break;
                case 404:
                    // 资源不存在
                    showNotFoundMessage();
                    break;
                // 其他错误码...
            }
        }
    }

    @Override
    public void onFailure(Call<User> call, Throwable t) {
        // 网络错误
        if (t instanceof SocketTimeoutException) {
            Toast.makeText(context, "连接超时,请检查网络", Toast.LENGTH_SHORT).show();
        } else if (t instanceof UnknownHostException) {
            Toast.makeText(context, "无法连接到服务器", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
});

实战案例:构建完整的网络层

最后,让我们通过一个完整的例子来展示如何在实际项目中使用Retrofit构建网络层:

1. 创建API服务接口

public interface GithubApiService {
    @GET("users/{username}")
    Call<GithubUser> getUser(@Path("username") String username);
    
    @GET("users/{username}/repos")
    Call<List<Repository>> getRepositories(@Path("username") String username);
    
    @GET("search/repositories")
    Call<SearchResult> searchRepositories(@Query("q") String query);
}

2. 创建模型类

public class GithubUser {
    private String login;
    private long id;
    private String avatar_url;
    private String name;
    private String bio;
    private int public_repos;
    private int followers;
    private int following;
    
    // getter和setter
}

public class Repository {
    private long id;
    private String name;
    private String description;
    private String html_url;
    private int stargazers_count;
    private int forks_count;
    
    // getter和setter
}

public class SearchResult {
    private int total_count;
    private List<Repository> items;
    
    // getter和setter
}

3. 创建API客户端类

public class GithubApiClient {
    private static final String BASE_URL = "https://api.github.com/";
    private static GithubApiClient instance;
    private GithubApiService apiService;
    
    private GithubApiClient() {
        // 创建OkHttpClient并添加拦截器
        OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(15, TimeUnit.SECONDS)
            .build();
            
        // 创建Retrofit实例
        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
            
        // 创建API服务
        apiService = retrofit.create(GithubApiService.class);
    }
    
    // 单例模式
    public static synchronized GithubApiClient getInstance() {
        if (instance == null) {
            instance = new GithubApiClient();
        }
        return instance;
    }
    
    // API方法
    public void getUser(String username, Callback<GithubUser> callback) {
        apiService.getUser(username).enqueue(callback);
    }
    
    public void getRepositories(String username, Callback<List<Repository>> callback) {
        apiService.getRepositories(username).enqueue(callback);
    }
    
    public void searchRepositories(String query, Callback<SearchResult> callback) {
        apiService.searchRepositories(query).enqueue(callback);
    }
}

4. 在Activity中使用

public class MainActivity extends AppCompatActivity {
    private TextView userInfoTextView;
    private RecyclerView repositoriesRecyclerView;
    private RepositoryAdapter adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        userInfoTextView = findViewById(R.id.user_info);
        repositoriesRecyclerView = findViewById(R.id.repositories_list);
        repositoriesRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new RepositoryAdapter();
        repositoriesRecyclerView.setAdapter(adapter);
        
        // 加载用户信息
        loadUserInfo("octocat");
    }
    
    private void loadUserInfo(String username) {
        // 显示加载中状态
        showLoading(true);
        
        // 获取用户信息
        GithubApiClient.getInstance().getUser(username, new Callback<GithubUser>() {
            @Override
            public void onResponse(Call<GithubUser> call, Response<GithubUser> response) {
                if (response.isSuccessful()) {
                    GithubUser user = response.body();
                    userInfoTextView.setText(
                        "用户名: " + user.getName() + "\n" +
                        "简介: " + user.getBio() + "\n" +
                        "仓库数: " + user.getPublic_repos() + "\n" +
                        "粉丝数: " + user.getFollowers()
                    );
                    
                    // 加载仓库列表
                    loadRepositories(username);
                } else {
                    showError("用户信息加载失败: " + response.code());
                    showLoading(false);
                }
            }

            @Override
            public void onFailure(Call<GithubUser> call, Throwable t) {
                showError("网络错误: " + t.getMessage());
                showLoading(false);
            }
        });
    }
    
    private void loadRepositories(String username) {
        GithubApiClient.getInstance().getRepositories(username, new Callback<List<Repository>>() {
            @Override
            public void onResponse(Call<List<Repository>> call, Response<List<Repository>> response) {
                showLoading(false);
                if (response.isSuccessful()) {
                    List<Repository> repositories = response.body();
                    adapter.setRepositories(repositories);
                } else {
                    showError("仓库列表加载失败: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<List<Repository>> call, Throwable t) {
                showLoading(false);
                showError("网络错误: " + t.getMessage());
            }
        });
    }
    
    private void showLoading(boolean isLoading) {
        // 显示或隐藏加载进度条
    }
    
    private void showError(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

总结

通过这篇教程,我们全面了解了Retrofit的基本用法和进阶技巧。从简单的GET请求到复杂的文件上传、参数传递,Retrofit都能轻松应对。它与OkHttp、Gson、RxJava的无缝集成,使Android应用的网络层开发变得前所未有的简单和高效!

为什么说Retrofit是Android开发者的首选HTTP客户端?因为它:

  1. 简化了网络请求代码 - 不再需要手动解析JSON或处理线程切换
  2. 提高了代码可读性和可维护性 - 声明式API让代码结构清晰
  3. 减少了错误 - 类型安全特性在编译期就能发现潜在问题
  4. 适应性强 - 可以轻松适应各种API结构和需求

如果你正在开发需要网络通信的Android应用,强烈建议你尝试使用Retrofit!它不仅能提高你的开发效率,还能让你的代码更加健壮和易于维护。

最后,别忘了查看Retrofit官方文档以获取更多详细信息和最新更新。希望这篇教程对你有所帮助,祝你编码愉快!

Retrofit 使用谈HTTP的概念、原理、⼯作机制、数据格式 HTTP 的定义 ⼀种⽹络传输协议,位于 TCP / IP 协议族的最顶层——应⽤层。 HTTP Hypertext Transfer Protocol,超⽂本传输协议,和 HTML (Hypertext Markup Language 超⽂本标 记语⾔) ⼀起诞⽣,⽤于在⽹络上请求和传输 HTML 内容。 超⽂本,即「扩展型⽂本」,指的是 HTML 中可以有链向别的⽂本的链接(hyperli... 阅读详情

相关推荐

ESP32智能家居Android控制App开发:HTTP+JSON通信与Retrofit实战

物联网应用开发中,设备与移动端的稳定通信是核心挑战。HTTP协议作为互联网基石,以其成熟的生态和清晰的请求-响应模型,成为低频控制类场景的理想选择。结合轻量易读的JSON数据格式,可高效实现设备状态查询与指令下发。在Android平台,借助Retrofit和OkHttp库,开发者能快速构建健壮的网络层,通过协程处理异步请求,确保UI流畅。这种技术组合特别适用于智能家居、环境监测等需要远程控制与数据可视化的项目,例如通过ESP32采集传感器数据并在App端实时展示,同时完成继电器等设备的开关控制。本文将以一个

weixin_34007886的博客 411

Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)

前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会喜欢。 如果对Retrofit v2.0的源码感兴趣,可看文章:Android:手把手带你深入剖析 Retrofit 2.0 源码 目录![目录](http://upload-

Carson带你学Android 25万+

Android登录注册模块实战:MVVM架构与Retrofit网络请求详解

在移动应用开发中,用户认证是核心基础功能,涉及前后端数据交互、状态管理与本地持久化等关键技术。其实现原理通常基于客户端-服务器架构,通过HTTP协议进行安全的数据传输,并采用设计模式如MVVM来分离界面逻辑与业务数据,以提升代码的可维护性和可测试性。这一技术组合的价值在于能够构建出响应迅速、用户体验良好的登录流程,是电商、社交、工具类等各类App的标配场景。本文以Android平台为例,具体演示了如何运用Retrofit库处理网络请求,并结合LiveData实现数据驱动UI更新,从而完成一个包含完整表单验证

weixin_31240035的博客 225

推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架,快来试试它!

在SpringBoot项目直接使用okhttp、httpClient或者RestTemplate发起HTTP请求,既繁琐又不方便统一管理。因此,在这里推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架retrofit-spring-boot-starter,使用非常简单方便,同时又提供诸多功能增强。目前项目已经更新至2.2.2版本,并且会持续进行迭代优化。 项目地址:https://github.com/LianjiaTech/retrofit-spring-boot-starter 前言

伍六七 1946

安卓原生开发为何是初创企业的生存基础设施

安卓原生开发是移动应用开发的基础技术路径,指基于Android SDK、直接调用系统API构建高性能、高可控性客户端的能力。其核心原理在于绕过Web容器或跨端中间层,实现对硬件传感器、后台服务、离线存储及厂商推送等底层能力的稳定访问。相比H5、小程序或跨平台方案,原生开发在弱网适配、消息送达率、启动性能和隐私合规等方面具备不可替代的技术价值。典型应用场景包括社区团购实时订单同步、智能硬件蓝牙联动、车载Android Auto集成、金融类App安全保活等强交互、低延迟、高可靠性需求领域。对于资源有限的初创企业

weixin_30776545的博客 452

Android逆向工程入门指南:从工具使用到实战分析

逆向工程是理解软件内部工作原理的关键技术,它通过分析编译后的程序来推断其设计逻辑和实现机制。在移动安全领域,Android逆向工程尤为重要,它基于对APK文件结构、Dalvik/ART字节码以及系统运行机制的理解。这项技术的核心价值在于安全评估、漏洞挖掘、协议分析和学习研究,广泛应用于恶意软件分析、隐私合规检测和第三方集成等场景。掌握逆向工程需要熟悉静态分析工具(如Jadx、Apktool)和动态调试框架(如Frida),并能应对代码混淆与加固等防护措施。本指南将系统介绍Android逆向的完整流程,涵盖环

bangtuo9862的博客 345

24、Android -- Retrofit 基础学习

Android 学习笔记

u013059089的博客 232

Android聊天Demo实现(数据库+RecyclerView)

配合博客教程:Android框架之路——聊天Demo实现

掌握Android开发利器:精选开源项目深度解析与实战应用

在Android开发的广阔生态中,开源项目如同璀璨星辰,为开发者提供了强大的工具支撑。**Android Open Source Projects**这个精心整理的分类集合,汇集了200多个高质量的Android开源项目,涵盖了从个性化UI组件到核心工具库的完整生态链。无论是初学者还是资深开发者,都能从中找到提升开发效率的利器。 ## 核心价值:为什么需要开源项目集合? 在Android开发实

gitblog_01162的博客 453

【从零开始玩量化1】AKShare: Python开源财经数据接口库

文章目录量化的第一步:数据AKShare介绍AKShare安装AKShare使用AKTools安装/使用结语 量化的第一步:数据 想要玩量化,第一步要有数据,这个数据可能是历史交易数据、财务数据、宏观数据等等。我们最终要做的,无非就是从数据中分析出有价值的信息,以便用来指导投资策略。 在获取数据的这条道路上,我走了很多弯路,尝试了各种方法:使用Tushare到放弃、自己写网易股票页面的爬虫,自己写申万行业数据的爬虫、自己写同花顺问财的爬虫、使用聚宽的免费数据API等等,直到最终,我发现了AKShare。 A

量化投资助手的博客 5万+

基于PLC的矿用排水控制系统设计【附代码】

(3)矿用排水控制系统的软件设计 研究设计了矿用排水控制系统的软件,包括PLC程序的编写和上位机监控画面的设计。(2)矿用排水控制系统的硬件设计 研究对矿用排水控制系统的硬件进行了选型和设计,包括矿用多级耐磨离心泵、三相异步防爆电机等执行设备的选型,以及控制系统所需用到的各类型传感器、PLC的I/O点分配及选型。(1)矿用排水控制系统的现状分析 研究首先对矿井排水系统的现状进行了分析,指出了现有系统存在的问题,如自动化程度低、劳动强度大、设备维护困难等。✅ 具体问题可以私信或查看文章底部二维码。

lagougongzuoshi的博客 1173

推荐项目:Retrofit_RxJava_MVP —— 构建高效网络请求的利器

推荐项目:Retrofit_RxJava_MVP —— 构建高效网络请求的利器 在快速迭代的移动开发领域,提升效率与优化代码结构是开发者永恒的话题。今天,我们来探索一个集智慧与优雅于一身的开源项目——Retrofit_RxJava_MVP,这是一把解锁现代Android应用开发高效之道的钥匙。 1. 项目介绍 Retrofit_RxJava_MVP 是一款利用了Retrofit进行网络请求,结合R...

gitblog_00092的博客 296

配电网可靠性评估(一)—最小路法和非序贯蒙特卡洛模拟法的matlab实现

电力系统的可靠性研究是相关领域的热点问题。根据研究对象的不同,又可分为发电系统的可靠性,输电系统的可靠性和配电系统的可靠性。配电网在电力系统中处于最末端的位置,直接和用户相连,一旦出现故障情况,就会在用户侧表现为停电事故。因此对配电网的可靠性评估有着重大意义。......

配电网和matlab的博客 1万+

探索 `Android-rxjava-retrofit-okhttp-app`:一个高效、灵活的安卓网络请求解决方案

探索 Android-rxjava-retrofit-okhttp-app:一个高效、灵活的安卓网络请求解决方案 在开发Android应用时,处理网络请求是一项必不可少的任务。提供了一个优雅且高效的解决方案,它结合了RxJava、Retrofit和OkHttp三大利器,使得网络编程变得更加简单和强大。 项目简介 此开源项目是一个示例应用,展示了如何在Android上利用RxJava、Retrofi...

gitblog_00060的博客 371

4、文化遗产数字记录的伦理框架构建

本文探讨了在数字技术快速发展的背景下,如何构建一个伦理框架以指导文化遗产的数字记录工作。文章分析了遗产保护的重要性以及当前面临的挑战,包括气候变化、全球化和技术变革等。同时,结合国际古迹遗址理事会(ICOMOS)的伦理原则和加拿大遗产专业人员协会(CAHP)的行为准则,提出了六个核心伦理类别,并讨论了其在实践中的应用。文章强调,伦理框架不仅有助于提高数字记录的质量和可持续性,还能促进专家合作、保护社区利益并确保数字遗产的长期可访问性。未来需要持续完善这一框架,以应对不断变化的技术和社会环境带来的新挑战。

7h6j5k4l3的博客 96

GEE APP:基于Sentinel-1 SAR数据的洪水检测与制图系统:利用GEE平台实现洪涝区域提取、面积统计及矢量栅格化导出

本文介绍了一个基于Google Earth Engine平台的Sentinel-1 SAR洪水监测应用,通过自动化流程实现洪水淹没区域的精准检测与分析。系统采用Refined Lee滤波降噪和Otsu自适应阈值算法,结合SRTM地形数据消除干扰,可自动计算淹没面积并生成可视化结果。该工具提供用户友好的交互界面,支持多格式数据导出,适用于灾害应急响应、环境监测和城市规划等领域,具有云平台处理、算法鲁棒性强和操作简便等技术优势。

此星光明博客 327

Android开发必备:20+高效开源库实战指南

在移动开发领域,开源库作为提升开发效率的关键工具,其核心价值在于复用成熟解决方案。以网络通信为例,Retrofit通过类型安全接口封装HTTP请求,配合OkHttp的底层优化,构建出高性能网络层。UI层面Glide凭借智能缓存机制实现图片加载零等待,而Jetpack Compose则引领声明式UI开发潮流。这些技术通过模块化设计降低耦合度,使开发者能快速构建稳定应用。特别在Kotlin协程成为异步处理标准的当下,配合Room数据库和Hilt依赖注入,形成现代Android应用的架构基础。从电商APP的图片加

weixin_33881140的博客 505

柔性电极材料新突破:清华团队实现0.1mV级脑信号采集精度

清华团队的 0.1mV 级柔性电极突破,不仅是材料科学与神经工程的跨界胜利,更标志着脑机接口从 “信号采集” 向 “神经交互” 的范式转变。当电极与脑组织实现 “柔性共生”,人类首次拥有了窥探大脑微观电活动的 “精密探头”,这既是神经疾病诊疗的里程碑,更是人机融合时代的新起点。随着技术标准化与产业生态的完善,这场始于实验室的 “柔性革命”,正加速向临床病房、智能工厂、消费电子等场景渗透,为脑机接口的大规模应用铺设 “柔性跑道”。:当柔性电极实现 “神经信号的无损捕捉”,如何平衡技术创新与伦理边界?

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2944

精选推荐:Retrofit Agera Call Adapter - 打造无缝数据流体验

精选推荐:Retrofit Agera Call Adapter - 打造无缝数据流体验 项目介绍 在Android开发领域中,Retrofit Agera Call Adapter是一个精巧的开源库,由知名开发者Drakeet贡献。它巧妙地结合了两大Google力推的技术——Retrofit和Agera,为移动应用的数据获取与处理提供了全新的解决方案。版本号定格在2.2.0-beta,体现其成熟...

gitblog_00154的博客 456

YOLO11涨点优化:loss优化 | 一种新的基于Wasserstein距离的小目标检测评估方法,助力小目标涨点

提出了一种新的基于Wasserstein距离的小目标检测评估方法,通过它们对应的高斯分布计算它们之间的相似性

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1016

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

从rex-weather学Android网络编程:高效处理JSON数据的最佳实践

rex-weather是一个Android示例项目,展示了如何使用Retrofit和RxJava与Web服务交互,是学习Android网络编程和JSON数据处理的绝佳实践案例。通过分析该项目的实现方式,新手开发者可以掌握现代Android应用中高效处理网络请求和JSON数据的核心技能。 ## 📚 项目核心架构解析 rex-weather项目采用了清晰的分层架构,将网络请求、数据模型和业务逻辑

gitblog_00890的博客 430

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android开发必备开源库选型与实战指南

在移动开发领域,开源库作为基础技术组件,能显著提升开发效率和质量。其核心原理是通过复用经过验证的代码实现,避免重复开发常见功能。从技术价值看,优秀的开源库通常具备性能优化、安全可靠、维护活跃等特点,如OkHttp的网络连接池、Glide的智能缓存机制。典型应用场景包括网络通信、图片加载、数据持久化等模块开发。本文重点解析Android生态中Jetpack组件、Retrofit+OkHttp组合、Room数据库等热门方案,并对比Glide与Picasso等工具的技术特性,帮助开发者构建高性能应用。

weixin_30565199的博客 358

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android Http

Android Http网络开发神兵利器 https://github.com/LiushuiXiaoxia/AndroidHttp?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io [TOC] 本人在Android移动端开发已经有不少年的经验,经历颇多,感受颇深,特写下此文记录下在Android

JxMY_1989的博客 1156

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

探索音频世界的利器:virtual-audio-graph

探索音频世界的利器:virtual-audio-graph 在现代Web开发中,音频处理已经成为一个不可或缺的部分。无论是音乐播放器、语音识别还是游戏音效,Web Audio API都扮演着重要的角色。然而,手动管理音频图的状态和连接往往复杂且容易出错。为了解决这一问题,virtual-audio-graph应运而生。 项目介绍 virtual-audio-graph是一个小巧且无依赖的库,旨在以...

gitblog_00089的博客 385

ChatGPT安卓端高效部署实战:从环境配置到性能优化

最近在做一个需要集成AI对话能力的安卓项目,目标是把类似ChatGPT的智能对话体验流畅地搬到移动端。本以为调用个API就完事了,结果从环境搭建到性能调优,踩的坑一个接一个。今天就把这次实战的经验整理成笔记,希望能帮到正在或打算做类似事情的开发者朋友们。

2600_94959834的博客 759
上一篇: Django:Python开发者的全栈加速器,拆解这把“瑞士军刀”!
下一篇: Katib 开源超参数调优的利器
普通网友
博客等级 码龄1年 41粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值