Android-如何使用viewmodel处理OnCreate中的HTTP调用,而该调用在屏幕旋转时不会被调用?

时间:2018-12-03 00:41:27

标签: android

。坚持在活动的oncreate中加载数据的基本方案。因此,我尝试在打开活动时立即加载数据,但是当我更改屏幕方向时,它将再次被调用。

以下是我进行改造的其余客户

public class MyRestApiClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).connectTimeout(30,TimeUnit.SECONDS).readTimeout(30,TimeUnit.SECONDS).build();
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

        retrofit = new Retrofit.Builder()
                .baseUrl("http://localhost:8080/rest/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)

                .build();



        return retrofit;
    }
}

下面是我的resturl界面,用于加载数据

   public interface MyRestUrlInterface {
    @GET("user/{user_id}")
        Call<Object> getData(@Path("user_id") String user_id);
    }

下面是我的viewmodel类:

public class MyViewModelObserver  extends ViewModel {

    private MutableLiveData<Object> httpCallBackObserver;

    public MutableLiveData<Object> getHttpCallBackObserver() {
        if (httpCallBackObserver == null) {
            httpCallBackObserver = new MutableLiveData<Object>();
        }
        return httpCallBackObserver;
    }
}

下面是我的活动代码:

public class MyActivity extends AppCompatActivity {
 private static final String TAG = "MyActivity" ;

 MyRestUrlInterface restUrlInterface;
 public MyViewModelObserver myViewModelObserver;

@Override   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        restUrlInterface = MyRestApiClient.getClient().create(MyRestUrlInterface.class);
        myViewModelObserver = ViewModelProviders.of(this).get(MyViewModelObserver.class);
        myViewModelObserver.getHttpCallBackObserver().observe(this, getData());
        //load data via http
        Call<Object> call = restUrlInterface.getData("123");
        call.enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
             myViewModelObserver.getHttpCallBackObserver().setValue(response.body());
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {

            }
        });

        }


private Observer<Object> getData(){
        return new Observer<Object>() {
            @Override
            public void onChanged(@Nullable final Object responseString) {
                Log.d(TAG,"***** Loaded Data --- "+responseString);

            }
        };
    }
}

如何使用视图模型,使其不会在屏幕方向更改时再次发出http调用

建议答案:

public class MyViewModelObserver  extends ViewModel {

    private MutableLiveData<Object> httpCallBackObserver;

    public MutableLiveData<Object> getHttpCallBackObserver() {
        if (httpCallBackObserver == null) {
            httpCallBackObserver = new MutableLiveData<Object>();
            loadData();

        }
        return httpCallBackObserver;
    }
    private void loadData(){
    Call<Object> call = restUrlInterface.getData("123");
            call.enqueue(new Callback<Object>() {
                @Override
                public void onResponse(Call<Object> call, Response<Object> response) {
                 myViewModelObserver.getHttpCallBackObserver().setValue(response.body());
                }

                @Override
                public void onFailure(Call<Object> call, Throwable t) {

                }
            });
    }
}

0 个答案:

没有答案