MapView очень медленно при перетаскивании - PullRequest
0 голосов
/ 13 июня 2019

Вот архитектура моего приложения.

MainActivity - это просто скелет, который загружает MainFragment в свой контейнер.

MainFragment содержит кнопку и при нажатии добавляет MapsFragment.

MapsFragment загружает вид карты. Он также покажет фрагмент диалога нестандартного размера поверх него с WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, установленным, чтобы сделать этот фрагмент диалога немодальным.

enter image description here

MapsFragment mapview будет работать нормально, если он запускается изнутри onResume. Принимая во внимание, что это будет очень медленно при перетаскивании, если это

  1. Запускается с помощью кнопки onClick или

  2. Запускается из onResume с задержкой не менее 1 мс.

Вот моя видеозапись https://youtu.be/x7hFa4Ny4hM

До 11s все работало нормально, так как запускается из onResume. После 12 с просмотр карты становится очень медленным, потому что он запускается из onClick.

Если MapsFragment не запускает фрагмент диалога, то просмотр карты будет работать нормально.

Кажется, если есть задержка по крайней мере на 1 мс, тогда карта будет отставать. Пожалуйста, помогите, так как я застрял на этом в течение 3 дней. спасибо!

Вот мой код

class MapsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)

        supportFragmentManager.beginTransaction()
            .add(R.id.fragment_container, MainFragment.newInstance())
            .commit()
    }
}

// -------------------------

class MainFragment : DialogFragment(), View.OnClickListener {

    companion object {
        fun newInstance() = MainFragment()
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onResume() {
        super.onResume()

        // if passing 0, 0, map will work fine, if passing at least 1 ms, map will be slow
        object : CountDownTimer(0, 0) {

            override fun onTick(millisUntilFinished: Long) {
                var left = millisUntilFinished / 1000
                button2.setText("$left")
            }

            override fun onFinish() {
                activity!!.supportFragmentManager.beginTransaction()
                .add(R.id.fragment_container, MapsFragment.newInstance())
                .addToBackStack(null)
                .commit()
            }

        }.start()
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
        button2.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        activity!!.supportFragmentManager.beginTransaction()
        .add(R.id.fragment_container, MapsFragment.newInstance())
        .addToBackStack(null)
        .commit()
    }
}

// -------------------------

class MapsFragment : DialogFragment() {

    companion object {
        fun newInstance() = MapsFragment()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.maps_fragment, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
 AddCitiesFragment.newInstance().show(activity!!.supportFragmentManager)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...