除了android中的活动之外,还有啥是调用网络类的好方法?

Posted

技术标签:

【中文标题】除了android中的活动之外,还有啥是调用网络类的好方法?【英文标题】:What can be a good way to call network class other than an activity in android?除了android中的活动之外,还有什么是调用网络类的好方法? 【发布时间】:2021-05-28 16:22:07 【问题描述】:

我创建了一个网络客户端应用程序(使用 Retrofit),我在活动中调用网络请求和响应。我了解到这是一种不好的做法。如果有人可以建议我可以遵循什么好的设计模式来进行这样的操作?

【问题讨论】:

您的意思是存储库吗? I learned that it is a bad practice. 你在做什么被认为是不好的做法?你能包括一些代码吗 使用存储库模式进行 API 调用,使用 DI SampleProject @a_local_nobody 我的意思是在活动中调用网络操作。网络操作就像从 API 中获取一些信息。由于 Activity 与 UI 相结合,可能一个好的软件设计模式不会遵循这种方式。 【参考方案1】:

如果您必须从头开始创建应用程序,请尝试遵循一种架构,因为您正在寻找网络调用,

您可以使用 MVVM 进行最佳实践,它还可以以最佳方式处理 api 请求如图所示, 这种架构,基本上将视图(UI)与视图模型(视图逻辑)分开

您要如何开发应用程序取决于您,这意味着您可以跳过存储库并在视图模型中处理网络调用,或者您可以创建一个存储库类并放置所有与网络相关的东西,即:网络调用和类似的东西。

参考教程:https://learntodroid.com/consuming-a-rest-api-using-retrofit2-with-the-mvvm-pattern-in-android/

【讨论】:

我猜这会很有用。非常感谢。【参考方案2】:

像这样创建一个 RetrofitClient 类

    public class RetrofitClient 

    public static final String BASE_URL = "YOUR BASE URL HERE";
    public static RetrofitClient mInstance;

    private Retrofit retrofit;

    public static RetrofitClient getInstance() 
        if (mInstance == null)
            mInstance = new RetrofitClient();
        return mInstance;
    

    private RetrofitClient() 
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    

    public ApiInterface getApiInterface() 
        return retrofit.create(ApiInterface.class);
    

    public interface ApiInterface 
        @GET("api_name_here")
        Call<ResponseBody> methodName();
    

存储库类

public class MyRepository 
        private static MyRepository mInstance;

        public static MyRepository getInstance() 
            if (mInstance == null)
                mInstance = new MyRepository();
            return mInstance;
        

        private MyRepository()

        

        private LiveData<T> getData()
            MutableLiveData<T> liveData = new MutableLiveData<>();

            RetrofitClient.getInstance()
                    .getApiInterface()
                    .methodName()
                    .enqueue(new Callback<T>() 
                @Override
                public void onResponse(@NonNull Call<T> call, @NonNull Response<T> response) 
                            liveData.setValue(response.body());

                

                @Override
                public void onFailure(@NonNull Call<T> call, @NonNull Throwable t) 
                   //  handleFailure
                
            );

            return liveData;

        

ViewModel 类

public class MyViewModel extends ViewModel
    private MyRepository myRepository;

    public MyViewModel()
        myRepository = MyRepository.getInstance();
    

    public LiveData<T> getData()
        return myRepository.getData();
    

然后在您的 Activity 或片段中

    MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
    myViewModel.getData().observe(this, new Observer<T>() 
        @Override
        public void onChanged(T t) 
            // handle your data here...
        
    );

【讨论】:

这就是我遵循 MVVM 模式的方式。如果您有任何问题,请告诉我。

以上是关于除了android中的活动之外,还有啥是调用网络类的好方法?的主要内容,如果未能解决你的问题,请参考以下文章

Android:除了 Location.getAltitude() 之外,还有其他方法可以获取高度吗? (我听说过使用传感器)

Android M请求权限非活动

除了 Android API 之外,还有其他用于计算地理围栏违规的 API

Android 啥是上下文? [复制]

Android:如何知道高级任务杀手杀死的活动/服务?

除了设置断点之外,还有啥方法(通过设置或扩展)来查看和使用 VSCODE 中的变量。喜欢蜘蛛?