除了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() 之外,还有其他方法可以获取高度吗? (我听说过使用传感器)