Saya menemukan fitur yang sangat aneh.
Saat saya mencoba menjalankan animasi di utas utama, animasi tidak dimulai. Ketika saya menjalankan animasi tersebut menggunakan
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
Itu dimulai.
Saya telah mencetak CurrentThread
sebelum memulai animasi dan keduanya mencetak main
.
Jelas, saya melewatkan sesuatu di sini, karena keduanya harus memulai animasi di utas utama ... Dugaan saya adalah bahwa saat pos menambahkan tugas ke antrean, ini dimulai pada "waktu yang tepat", tetapi saya ingin tahu apa yang terjadi di sini secara lebih mendalam.
EDIT: Biarkan saya menjelaskan semuanya - pertanyaan saya adalah, mengapa memulai animasi pada posting menyebabkannya dimulai, ketika memulai animasi di utas utama tidak.
AnimationDrawable
!Animation
Instance biasa mulai berhasil dianimasikan di setiap penyiapan. DalamAnimationDrawable
kasus; ketika Anda mencoba untuk memulainyaonCreate
, itu tidak dimulai karena tidak melekat pada tampilan pada saat itu. Jadi ini bukan masalah threadingAnimationDrawable
. Mungkin hal yang sama berlaku untukAnimation
? developer.android.com/guide/topics/graphics/…Jawaban:
post : post menyebabkan Runnable ditambahkan ke antrian pesan,
Runnable: Merupakan perintah yang dapat dijalankan. Sering digunakan untuk menjalankan kode di Thread yang berbeda.
run () : Mulai menjalankan bagian aktif dari kode kelas. Metode ini dipanggil saat utas dimulai yang telah dibuat dengan kelas yang mengimplementasikan Runnable.
kode :
getView().startAnimation(a);
dalam kode Anda,
posting menyebabkan Runnable ( kode akan dijalankan di utas yang berbeda) untuk menambahkan antrian pesan.
Jadi startAnimation akan diaktifkan di utas baru saat diambil dari messageQueue
[EDIT 1]
Mengapa kami menggunakan utas baru, bukan utas UI (utas utama)?
Benang UI:
Saat aplikasi dimulai, Ui Thread dibuat secara otomatis
itu bertanggung jawab untuk mengirimkan acara ke widget yang sesuai dan ini termasuk acara menggambar.
Ini juga merupakan utas tempat Anda berinteraksi dengan widget Android
Apa yang terjadi jika pengguna menekan tombol yang akan melakukan longOperation?
UI membeku. Program bahkan mungkin macet.
Ini melanggar aturan android yang tidak pernah mengupdate UI langsung dari thread pekerja
Android menawarkan beberapa cara untuk mengakses thread UI dari thread lain.
Seperti di bawah ini,
View.post (Dapat Dijalankan)
Penangan
Untuk info lebih lanjut
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/
sumber
Apakah ini dilakukan di onCreate atau onCreateView? Jika demikian, aplikasi mungkin tidak dalam keadaan di mana View dilampirkan ke jendela. Banyak algoritme yang didasarkan pada metrik Tampilan mungkin tidak berfungsi karena hal-hal seperti pengukuran dan posisi Tampilan mungkin belum dihitung. Animasi Android biasanya membutuhkannya untuk dijalankan melalui matematika UI
View.post sebenarnya mengantrekan animasi pada loop pesan View, jadi setelah tampilan dilampirkan ke jendela, ia mengeksekusi animasi alih-alih menjalankannya secara manual.
Anda sebenarnya menjalankan sesuatu di thread UI, tetapi pada waktu yang berbeda
sumber
Lihat di sini untuk jawaban yang bagus. view.post () hampir sama dengan handler.post (). Ini masuk ke antrean utas utama dan dijalankan setelah tugas tertunda lainnya selesai. Jika Anda memanggil activity.runOnUiThread (), itu akan segera dipanggil di UI thread.
sumber
Masalah yang saya pikir bisa menjadi metode siklus hidup di mana Anda memanggil metode post (). Apakah Anda melakukannya di onCreate ()? jika demikian, lihat apa yang saya temukan di dokumentasi onResume () aktivitas:
https://developer.android.com/reference/android/app/Activity.html#onResume ()
Jadi, seperti yang dikatakan Joe Plante, mungkin tampilan belum siap untuk memulai animasi saat Anda memanggil post (), jadi coba pindahkan ke onResume ().
PD: Sebenarnya jika Anda memindahkan kode ke onResume () maka saya pikir Anda dapat menghapus panggilan post () karena Anda sudah berada di ui-thread dan tampilan harus siap untuk memulai animasi.
sumber
onResume
dapat dipanggil beberapa kali (layar tidur, aktivitas didorong ke backstack, dll ...) setelah awalnya saat "tampilan sudah siap". Jika dipanggil darionResume
, maka bendera mungkin diperlukan untuk melacak cuaca animasi telah dimulai, untuk menghindari (ulang) mulai beberapa kali.