【问题标题】:Not able to return arraylist outside the scope, it becomes null无法在范围外返回arraylist,它变为null
【发布时间】:2019-06-12 21:39:01
【问题描述】:

当我将获得的数据(包含在 arraylist 中)复制到新的 arraylist 并返回时,新的 arraylist 不会返回任何值。 onDataReceived(ArrayList arrayList)是arraylist中volley异步获取数据后的监听回调方法。

package com.example.bike.ViewModels;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.support.annotation.NonNull;
import com.example.bike.Models.BikesInfo;
import com.example.bike.Repository.BikesRepository;
import com.example.bike.Repository.Listener;
import com.example.bike.Views.ApplicationContext;
import java.util.ArrayList;
import java.util.Collections;

public class BikesViewModel extends AndroidViewModel {
 private BikesRepository bikesRepository;
 public static ArrayList<BikesInfo> vmarrayList = new ArrayList<>();
 public BikesViewModel(@NonNull Application application) {
    super(application);
     bikesRepository = new BikesRepository(application, new Listener() {
            @Override
            public void onDataReceived(ArrayList<BikesInfo> arrayList) {

                vmarrayList.addAll(arrayList);
            }

            @Override
            public void onError(int error) {

            }
        });
        bikesRepository.getArrayList();

    }

public ArrayList<BikesInfo> getbikesinfolistobservable(){
       return vmarrayList;
  }

}

编辑: MainActivity.java

package com.example.bike.Views.ui;

import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.bike.Models.BikesInfo;
import com.example.bike.R;
import com.example.bike.ViewModels.BikesViewModel;
import com.example.bike.Views.Adapters.BikesListAdapter;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    BikesViewModel bikesViewModel;

    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    BikesListAdapter bikesListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.bikes_recycler);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);

        bikesViewModel = ViewModelProviders.of(MainActivity.this).get(BikesViewModel.class);

        bikesListAdapter = new BikesListAdapter(bikesViewModel.getbikesinfolistobservable());
        recyclerView.setAdapter(bikesListAdapter);

    }

}

【问题讨论】:

  • 主要是因为在回调“OnDataReceived”之前调用了“getbikesinfolistobeservable”方法。在调试模式下检查执行。
  • vmarrayList 是空的还是空的?如果它为空,则检查它是否是从此类外部更改的。如果它为空可能是因为执行顺序。
  • 另外,如果你要使用getter,为什么变量是静态的?
  • @Marco 我认为你是对的,我迟到了数据。如何克服这个问题?
  • @EugenioValeiras vmarraylist 起初是空的,但我正在复制另一个数组列表,然后返回它

标签: java android arraylist return


【解决方案1】:

如果您使用 volley 发出请求,则无法确保 getbikesinfolistobservable() 的调用将在请求完成后执行,因为它是异步请求。

尝试在 vmarrayList.addAll(arrayList) 之后在 vmarrayList 上执行控制台日志。如果仍然是空的,那么ArrayList arrayList也是空的,所以请求的响应会有问题。

vmarrayList 也是一个静态变量,而 BikesViewModel 类是公共的,因此您不需要 getter。

【讨论】:

  • 我检查了 'onDataReceived(ArrayList arrayList)' 中的 'arraylist' 不为空。它有获取的 json 数据。
  • 你试过这个“尝试在vmarrayList.addAll(arrayList)之后在vmarrayList上做一个控制台日志”吗?
  • 是的,但不完全是控制台日志,而是我使用断点来查看 arraylist 是否为空并且它不是。
  • 您确定在调用 getbikesinfolistobservable() 之前等待请求完成吗?
  • 正如 Marco 所说:您可以在变量上设置一个 observable,并在调用 getbikesinfolistobservable() 时以观察者身份订阅。结帐:developer.android.com/topic/libraries/architecture/viewmodel
猜你喜欢
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2015-10-08
相关资源
最近更新 更多