Почему второй метод не вызывается, когда я передаю параметр?

#java #android #methods #handler

Вопрос:

Это что-то странное, чего я раньше не встречал. У меня есть обработчик в TestsViewModel.class. Мне нужно установить его как параметр в методе startMapThreads () (startMapThreads(ViewModel.handler)). Когда я звонил без обработчика, все работало нормально. Но если я задам обработчик как параметр, он не сможет достичь второго метода. Я также не делаю никаких изменений, только добавляю параметр. Кто-нибудь знает, почему я не могу достичь второго метода вместе с параметром?

На первом рисунке я достигаю метода 3, на втором с параметром обработчика только первый метод.

 public class TestsViewModel extends ViewModel {

    public MutableLiveData<DataClass> testResult = new MutableLiveData<>();
    public Handler handler;

    public TestsViewModel() {
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.i("tester", "result: "   (DataClass) msg.obj);
            }
        };
    }
}

 
 public class FragmentMaps extends Fragment {

    private static FragmentMaps mapsInstance;
    private static FragmentMapsBinding binding;
    public TestsViewModel viewModel;

    public static FragmentMaps getMapsInstance() {
        if (mapsInstance == null) {
            mapsInstance = new FragmentMaps();
        }
        return mapsInstance;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        binding = FragmentMapsBinding.inflate(inflater, container, false);

        initObjects();
   
        return binding.getRoot();
    }

    private void initObjects() {
        viewModel = new ViewModelProvider(this,
                new TestModelFactory())
                .get(TestsViewModel.class);
    }

    public void startMapThreads() {
        Log.i("tester", "method called 1");
        ThreadsManager threadsManager = new ThreadsManager();
        threadsManager.startMapThreads();
        //displayProgressBars();
    }
}
 
 public class ThreadsManager {

    public static boolean stopThreads = false; //We change this variable MainActivity
    public static long timeOfStartTest = 0;

    public void startMapThreads() {
        Log.i("tester", "method called 2");
        createMapThreadWithMap(() -> new TreeMap());
        createMapThreadWithMap(() -> new HashMap());
    }

    private void createMapThreadWithMap(MapFactory mapFactory) {
        Log.i("tester", "method called 3");
        stopThreads = false;
        timeOfStartTest = new Date().getTime();

        MapRunnable mapRunnable = new MapRunnable();

        new Thread(mapRunnable.addingNew(mapFactory.create())).start();
        new Thread(mapRunnable.searchByKey(mapFactory.create())).start();
        new Thread(mapRunnable.removing(mapFactory.create())).start();
    }
}
 

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Наконец — то я нашел причину всего этого. Я создал обработчик в ViewModel и в конструкторе инициализировал его. Но я не инициализировал петлитель. Поэтому, пока я пытался получить метод номер 2, он был в другом цикле. Конструктор обработчика дублируется, вам нужно инициализироваться следующим образом:

 Handler handler = new Handler(Looper.getMainLooper());
 

Дублированный:

 Handler handler = new Handler();
 

введите описание изображения здесь