Saya mencoba melakukan ini
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry egg");
tetapi untuk beberapa alasan, hanya teks kedua yang muncul saat saya menjalankannya. Saya pikir itu mungkin ada hubungannya dengan Thread.sleep()
metode pemblokiran. Jadi, dapatkah seseorang menunjukkan kepada saya bagaimana menerapkan pengatur waktu "secara tidak sinkron"?
Terima kasih.
.setText()
mengganti seluruh "widget" dengan teks yang Anda perintahkan untuk disetel; TERMASUK teks yang sudah Anda taruh di sana.Jawaban:
Saya baru saja memposting jawaban ini di grup google-diskusi android
Jika Anda hanya mencoba menambahkan teks ke tampilan sehingga tampilan menampilkan "Langkah Pertama: ledakan telur Langkah Kedua: goreng telur" Kemudian pertimbangkan untuk menggunakan
t.appendText("Step Two: fry egg");
alih-aliht.setText("Step Two: fry egg");
Jika Anda ingin benar-benar mengubah apa yang ada di dalam
TextView
sehingga tertulis "Langkah Pertama: ledakan telur" saat startup dan kemudian dikatakan "Langkah Kedua: goreng telur" di lain waktu Anda selalu dapat menggunakanContoh runnable yang diberikan sadboy
Semoga berhasil
sumber
onCreate()
Metode Anda memiliki beberapa kekurangan besar:1)
onCreate
mempersiapkan Aktivitas Anda - jadi apa pun yang Anda lakukan di sini tidak akan terlihat oleh pengguna sampai metode ini selesai! Misalnya - Anda tidak akan pernah bisa mengubahTextView
teks a di sini lebih dari SATU kali karena hanya perubahan terakhir yang akan dibuat dan terlihat oleh pengguna!2) Perlu diingat bahwa program Android akan - secara default - hanya berjalan dalam SATU utas! Jadi: jangan pernah menggunakan
Thread.sleep()
atauThread.wait()
di utas utama Anda yang bertanggung jawab atas UI Anda! (baca "Menjaga Aplikasi Anda Tetap Responsif" untuk informasi lebih lanjut!)Apa yang dilakukan inisialisasi Aktivitas Anda adalah:
TextView
objek barut
!TextView
di variabelt
nanti.t
(namun perlu diingat: teks hanya akan ditampilkan setelahonCreate()
selesai dan loop peristiwa utama aplikasi Anda berjalan!)onCreate
metode Anda - ini tidak boleh dilakukan karena menghentikan semua aktivitas UI dan pasti akan memaksa ANR (Aplikasi Tidak Merespons, lihat tautan di atas!)onCreate()
metode Anda selesai dan beberapa metode siklus hidup Aktivitas lainnya telah diproses!Solusinya:
Setel teks hanya sekali
onCreate()
- ini harus menjadi teks pertama yang harus terlihat.Buat
Runnable
dan aHandler
private final Runnable mUpdateUITimerTask = new Runnable() { public void run() { // do whatever you want to change here, like: t.setText("Second text to display!"); } }; private final Handler mHandler = new Handler();
instal runnable ini sebagai handler, mungkin di
onCreate()
(tapi baca saran saya di bawah):// run the mUpdateUITimerTask's run() method in 10 seconds from now mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
Saran: pastikan Anda mengetahui
Activity
siklus hidup! Jika Anda melakukan hal-hal seperti itu,onCreate()
ini hanya akan terjadi saat AndaActivity
dibuat pertama kali! Android mungkin akan membuat Anda tetapActivity
hidup untuk jangka waktu yang lebih lama, meskipun tidak terlihat! Saat pengguna "memulai" lagi - dan teks tersebut masih ada - Anda tidak akan melihat teks pertama Anda lagi!=> Selalu instal penangan
onResume()
dan nonaktifkan merekaonPause()
! Jika tidak, Anda akan mendapatkan "pembaruan" saat AndaActivity
tidak terlihat sama sekali! Dalam kasus Anda, jika Anda ingin melihat teks pertama Anda lagi ketika diaktifkan kembali, Anda harus mengaturnyaonResume()
, bukanonCreate()
!sumber
Baris pertama tampilan teks baru tidak diperlukan
t=new TextView(this);
kamu bisa melakukan ini
TextView t = (TextView)findViewById(R.id.TextView01);
sejauh utas latar belakang yang tidur di sini adalah contoh, tetapi saya pikir ada pengatur waktu yang akan lebih baik untuk ini. berikut ini tautan ke contoh yang baik menggunakan pengatur waktu sebagai gantinya http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask); thr.start(); } Runnable mTask = new Runnable() { public void run() { // just sleep for 30 seconds. try { Thread.sleep(3000); runOnUiThread(done); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable done = new Runnable() { public void run() { // t.setText("done"); } };
sumber
@ pengguna264892
Saya menemukan bahwa ketika menggunakan variabel String saya perlu baik awalan dengan String "" atau secara eksplisit dilemparkan ke CharSequence.
Jadi, alih-alih:
String Status = "Asking Server..."; txtStatus.setText(Status);
mencoba:
String Status = "Asking Server..."; txtStatus.setText((CharSequence) Status);
atau:
String Status = "Asking Server..."; txtStatus.setText("" + Status);
atau, karena string Anda tidak dinamis, bahkan lebih baik:
txtStatus.setText("AskingServer...");
sumber
sesuai saran Anda, saya menggunakan pegangan dan runnables untuk beralih / mengubah konten TextView menggunakan "timer". karena alasan tertentu, saat berjalan, aplikasi selalu melewatkan langkah kedua ("Langkah Kedua: telur goreng"), dan hanya menampilkan langkah terakhir (ketiga) ("Langkah tiga: sajikan telur").
TextView t; private String sText; private Handler mHandler = new Handler(); private Runnable mWaitRunnable = new Runnable() { public void run() { t.setText(sText); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMonster = BitmapFactory.decodeResource(getResources(), R.drawable.monster1); t=new TextView(this); t=(TextView)findViewById(R.id.TextView01); sText = "Step One: unpack egg"; t.setText(sText); sText = "Step Two: fry egg"; mHandler.postDelayed(mWaitRunnable, 3000); sText = "Step three: serve egg"; mHandler.postDelayed(mWaitRunnable, 4000); ... }
sumber
:) Anda menggunakan utas dengan cara yang salah. Lakukan saja berikut ini:
private void runthread() { splashTread = new Thread() { @Override public void run() { try { synchronized(this){ //wait 5 sec wait(_splashTime); } } catch(InterruptedException e) {} finally { //call the handler to set the text } } }; splashTread.start(); }
Itu dia.
sumber
menyetel teks ke sam textview dua kali menimpa teks tertulis pertama. Jadi kedua kalinya saat kita menggunakan settext kita hanya menambahkan string baru seperti
textview.append("Step Two: fry egg");
sumber
@Zordid @Iambda Jawabannya bagus, tetapi saya menemukan itu jika saya menempatkannya
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
dalam metode run () dan
mHandler.postDelayed(mUpdateUITimerTask, 0);
dalam metode onCreate buat sesuatu terus diperbarui.
sumber