Android studio 视图模型在重新加载片段后不返回任何数据

Android studio 视图模型在重新加载片段后不返回任何数据,android-studio,android-fragments,android-livedata,android-viewmodel,Android Studio,Android Fragments,Android Livedata,Android Viewmodel,正在尝试实施: 1.从视图模型加载数据之前进行internet检查。 2.片段不应从视图模型中获取任何数据(不设置任何观察者),如果它们没有连接,则显示警报对话框。 3.如果连接可用,则使用警报对话框中的“重试”按钮从视图模型重新加载/获取数据 问题: 但当尝试从“重试”按钮重新加载数据时,不会从视图模型中获取任何数据。若我从一开始就有可用的internet连接,那个么视图模型就并没有问题了。但是,如果我从一开始就没有互联网,并尝试从“重试”按钮重新加载数据,则会发生这种情况 我还尝试重新加载整

正在尝试实施:

1.从视图模型加载数据之前进行internet检查。 2.片段不应从视图模型中获取任何数据(不设置任何观察者),如果它们没有连接,则显示警报对话框。 3.如果连接可用,则使用警报对话框中的“重试”按钮从视图模型重新加载/获取数据

问题: 但当尝试从“重试”按钮重新加载数据时,不会从视图模型中获取任何数据。若我从一开始就有可用的internet连接,那个么视图模型就并没有问题了。但是,如果我从一开始就没有互联网,并尝试从“重试”按钮重新加载数据,则会发生这种情况

我还尝试重新加载整个片段,而不是使用以下代码调用“getDataFromViewModel”方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            getParentFragmentManager().beginTransaction().detach(this).commitNow();
            getParentFragmentManager().beginTransaction().attach(this).commitNow();
        } else {
            getParentFragmentManager().beginTransaction().detach(this).attach(this).commit();
        }
但这也不起作用

这是我的片段类:

public class GlobalDataFragment extends Fragment implements AlertDialogClass.AlertDialogClickInterface {


    public GlobalDataFragment() {

    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        viewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication())).get(GlobalDataViewModel.class);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_global_data, container, false);

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        totalCase = (TextView) view.findViewById(R.id.tvTotalCases);
        activeCase = (TextView) view.findViewById(R.id.tvActiveCases);
        recovered = (TextView) view.findViewById(R.id.tvRecovered);
        caseToday = (TextView) view.findViewById(R.id.tvTodayCase);
        casePM = (TextView) view.findViewById(R.id.tvCasesPM);
        todayDeath = (TextView) view.findViewById(R.id.tvTodayDeaths);
        totalDeath = (TextView) view.findViewById(R.id.tvTotalDeaths);
        deathsPM = (TextView) view.findViewById(R.id.tvDeathsPM);
        criticalCondition = (TextView) view.findViewById(R.id.tvCriticalCase);
        totalTested = (TextView) view.findViewById(R.id.tvTested);
        testsPM = (TextView) view.findViewById(R.id.tvTestsPM);
        affectedCountries = (TextView) view.findViewById(R.id.tvAffectedCountries);
        simpleArcLoader = (ProgressBar) view.findViewById(R.id.simpleArcLoader);
        pieChart = (PieChart) view.findViewById(R.id.pieChart);
        nestedScrollView = (ScrollView) view.findViewById(R.id.nestedScrollView);
        navController = Navigation.findNavController(view);
        alertDialogClass = new AlertDialogClass(getContext(), this);


        getDataFromViewModel();


    }

    private void getDataFromViewModel() {
        try {
            if (CheckConnection.isConnected()) {

                viewModel.getGlobalData().observe(getViewLifecycleOwner(), this::setViewData);

            } else {

                alertDialogClass.show();

            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void setViewData(GlobalData globalData) {

        if (globalData != null) {
            totalTested.setText(globalData.getTests());
            testsPM.setText(globalData.getTestsPerOneMillion());
            affectedCountries.setText(globalData.getAffectedCountries());


            setPieGraph(globalData);
            simpleArcLoader.setVisibility(View.GONE);
            nestedScrollView.setVisibility(View.VISIBLE);


        }
    }

//Called when clicked on try again button of alert dialog
    @Override
    public void OnAlertButtonClicked() {

        alertDialogClass.dismiss();
        getDataFromViewModel();

    }
}
我的视图模型类:

public class GlobalDataViewModel extends AndroidViewModel {

    private Repository repository;
    private LiveData<GlobalData> globalData = new MutableLiveData<>();

    public GlobalDataViewModel(@NonNull Application application) {
        super(application);

        repository = Repository.getInstance();
        globalData = repository.getGlobalData();

    }


    public void init() {

    }

    public LiveData<GlobalData> getGlobalData() {
        return globalData;
    }
}
公共类GlobalDataViewModel扩展了AndroidViewModel{
私有存储库;
private LiveData globalData=new MutableLiveData();
公共GlobalDataViewModel(@NonNull应用程序){
超级(应用);
repository=repository.getInstance();
globalData=repository.getGlobalData();
}
公共void init(){
}
公共LiveData getGlobalData(){
返回全局数据;
}
}
当发生internet连接时,我的片段如下所示:


按后重试该方法(getDataFromViewModel)调用了,但视图模型未返回任何数据。但当我从一开始加载具有internet的片段时,相同的方法工作正常。发生这种情况是因为我在视图模型上初始化和设置观察者的方式还是其他原因?请帮助并建议我如何解决此问题。

您没有显示存储库配置,无论如何,我认为您的问题在于,您正在从存储库中获取数据(在本例中,我认为是在没有internet的外部网络[internet]),并且您没有再次尝试获取数据,总之,您正在观察以下情况:

private LiveData<GlobalData> globalData = new MutableLiveData<>();
private LiveData globalData=new MutableLiveData();
由于在初始化viewmodel时没有internet连接,因此它是空的

您可以做些什么来修复它:

private LiveData<GlobalData> globalData = repository.getGlobalData();
private LiveData globalData=repository.getGlobalData();
这样,只有在观察此globalData时才会触发网络获取


让我知道这对你是否有意义。

谢谢你,兄弟。你说得对,导致这个问题的原因是正确的。正如你所说,我删除了这个部分
globalData=repository.getGlobalData()
到另一个方法:
public void init(){if(globalData==null)globalData=repository.getGlobalData();}
。只有当他们的internet连接正常时才调用该方法,以确保我没有像您指出的那样在没有internet的情况下尝试触发网络获取。现在它工作正常。再次感谢