#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();