Tugas tak segerak AnsyncTask


Pengenalan kepada bahagian ini:

Apa yang dibawa oleh bahagian ini kepada anda ialah kelas ringan yang disediakan oleh Android untuk mengendalikan tugas tak segerak: AsyncTask, biasanya kami Warisi AsyncTask, kemudian laksanakan operasi asynchronous dalam kelas, dan kemudian suapan semula kemajuan pelaksanaan asynchronous ke utas utama UI~ Okay, mungkin anda tidak memahami beberapa konsep, dan saya rasa masih perlu untuk menerangkan konsep multi-threading, jadi mari kita terangkan beberapa perkara konsep dahulu!


1. Konsep berkaitan

1) Apakah itu multi-threading:

Jawapan: Anda mesti memahami nama-nama ini dahulu: aplikasi, proses, Thread , berbilang benang! !

  • Aplikasi (Aplikasi) : Satu set arahan (satu set kod statik) yang ditulis dalam bahasa tertentu untuk menyelesaikan tugas tertentu
  • Proses:Program berjalan, unit bebas penjadualan sistem dan peruntukan sumber, sistem pengendalian akan memperuntukkannya kepada setiap proses Bahagian ruang memori, program dilaksanakan secara dinamik secara berurutan, kod pengurus dimuatkan ->
  • Thread: Unit pelaksanaan yang lebih kecil daripada proses Setiap proses mungkin mempunyai berbilang utas Thread perlu diletakkan dalam satu proses untuk dilaksanakan. Benang diuruskan oleh program! ! ! Proses ini dijadualkan oleh sistem! ! !
  • Pembacaan Berbilang: Laksanakan berbilang arahan secara selari dan peruntukkan kepingan masa CPU kepada setiap urutan mengikut algoritma penjadualan, sebenarnya, ia adalahMasa-. perlaksanaan perkongsian cuma masa penukaran adalah sangat singkat, dan pengguna merasakannya pada masa yang sama!

Contoh mudah: Anda menutup sambungan QQ dan tiba-tiba mahu mendengar muzik Adakah anda perlu mematikan QQ dan kemudian memulakan pemain XX? Jawapannya tidak, mari buka pemain secara langsung Main lagu, QQ masih berjalan kan? Ini adalah multi-threading yang mudah~ Dalam pembangunan sebenar, terdapat juga contoh seperti itu, seperti aplikasi sedang berjalan, Kami telah menemui versi baharu dan ingin mengemas kininya di latar belakang Pada masa ini, kami biasanya membuka jalur latar belakang untuk memuat turun versi baharu apk, tetapi pada masa ini Kami juga boleh menggunakan ciri lain dalam apl! Ini adalah contoh penggunaan multi-threading~

2) Konsep penyegerakan dan tak segerak:

Jawapan: Penyegerakan: Apabila kita melaksanakan fungsi tertentu, panggilan tidak boleh kembali sebelum mendapat keputusan! Secara ringkasnya, ia bermakna ia mesti begitu Tunggu perkara sebelumnya selesai sebelum anda boleh melakukan perkara seterusnya; untuk memberikan contoh mudah: jika anda melakukan hubungan seks, untuk mengelakkan pembunuhan seseorang, anda mesti memakai kondom terlebih dahulu. Kemudian bersetubuh semula, kan? Pakai kondom -> Selepas anda membeli kondom dan membawanya bersama anda, anda boleh mula melakukan hubungan seks pada masa ini ~ Contoh yang jelas, ♪(^∇^*)Asynchronous: Ia adalah relatif kepada segerak apabila kita melaksanakan sesuatu fungsi , kita tidak perlu mendapatkan hasilnya dengan segera, kita boleh seperti biasa Untuk melakukan operasi lain, fungsi ini boleh memberitahu kami atau memanggil semula selepas selesai masih contoh muat turun latar belakang di atas, muat turun latar belakang, Selepas kami melaksanakan fungsi muat turun, kami tidak perlu mengambil berat tentang proses muat turunnya Kami hanya boleh memberitahu kami apabila muat turun selesai~

3) Mengapa Android perlu memperkenalkan tugas tak segerak

Jawapan: Kerana apabila program Android mula-mula dimulakan, utas utama yang sepadan (Benang Utama) akan dimulakan pada masa yang sama ini bertanggungjawab terutamanya untuk memproses Acara berkaitan UI! Kadang-kadang kami juga memanggilnya benang UI! Dalam Apl Android, kita mesti mematuhi peraturan model satu benang ini: Operasi UI Android tidak selamat untuk benang dan operasi ini perlu dilaksanakan dalam urutan UI! Jika kami berada dalam utas bukan UI, seperti Thread() baharu dalam utas utama, buat utas lain dan kemudian ubah suai terus nilai kawalan UI di dalamnya; Pada masa ini, pengecualian berikut akan dilemparkan: android.view.ViewRoot$CalledFromWrongThreadException: Hanya urutan asal yang mencipta hierarki paparan boleh menyentuh pandangannyaSelain itu, terdapat satu lagi perkara, jika kita mengambil semua operasi yang memakan masa Jika diletakkan dalam utas UI, jika utas UI tidak membalas permintaan selama lebih daripada 5s, maka Pada masa ini, pengecualian ANR (Application Not Responding) akan dicetuskan, yang bermaksud bahawa aplikasi tidak bertindak balas~ Perkara terakhir ialah: selepas Android 4.0, dilarang melakukan operasi rangkaian dalam utas UI~ Jika tidak, ia akan melaporkan: android.os.NetworkOnMainThreadException

Sebab di atas semua menerangkan Android Kepentingan memperkenalkan tugas tak segerak, sudah tentu, tidak perlu untuk melaksanakan tugas tak segerak tanpa penjelasan kami dalam bahagian ini. AsyncTask, kami boleh membuka thread sendiri Selepas menyelesaikan operasi yang berkaitan, kami boleh mengemas kini UI melalui dua kaedah berikut:

  1. Pengendali yang kami pelajari sebelum ini, kami menulis kemas kini UI dalam Pengendali, dan kemudian memaklumkan UI melalui kaedah seperti sendMessage() Kemas kini, jangan lupa perbezaan antara Pengendali yang ditulis dalam utas utama dan sub-utas~
  2. Gunakan Activity.runOnUiThread(Runnable) untuk mencipta kod untuk mengemas kini ui dalam Runnable Hanya masukkan objek ke dalam~

2. Analisis penuh AsyncTask:


1) Mengapa menggunakan AsyncTask?

Jawapan: Kami boleh menggunakan dua kaedah di atas untuk menyelesaikan operasi tak segerak kami. Sekiranya kita baru Thread() dan kemudian menggunakan kaedah di atas untuk memberitahu UI tentang kemas kini? Pengaturcara cenderung menjadi malas Sejak rasmi Kami menyediakan AsyncTask, kelas tak segerak ringan terkapsul, mengapa tidak menggunakannya? Kita boleh melakukannya dengan berpuluh-puluh baris kod Operasi tak segerak kami, dan kemajuannya boleh dikawal berbanding dengan Handler, AsyncTask lebih mudah dan lebih pantas ~ Sudah tentu, ini hanya sesuai untuk Operasi tak segerak mudah Selain itu, operasi tak segerak yang paling biasa digunakan ialah operasi rangkaian, pemuatan imej, penghantaran data, dll. AsyncTask. Ia boleh memenuhi keperluan pemula buat masa ini. Terima kasih untuk aplikasi kecil Tetapi selepas syarikat benar-benar melakukan projek, kami akan menggunakan lebih banyak lagi. Terdapat banyak rangka kerja, seperti Tampar, OkHttp, android-async-http, XUtils, dll. Kami akan memilih 1-2 rangka kerja untuk tutorial lanjutan nanti. Belajar, sudah tentu anda boleh mencari bahan untuk belajar sendiri, tetapi masih perlu untuk menguasai AsyncTask!


2) Struktur asas AsyncTask


AsyncTask ialah kelas abstrak Secara amnya, kami akan mentakrifkan kelas untuk mewarisi AsyncTask dan kemudian menimpa kaedah berkaitan~ API Rasmi: AsyncTask

  • Parameter untuk membina subkelas AsyncTask:

1.jpg

  • Kaedah dan proses pelaksanaan yang berkaitan:

2.jpg

  • Nota :

3.jpg


contoh penggunaan AsyncTask:

Kerana kami belum mempelajari Android As. untuk rangkaian, saya akan menguruskan semua pemula di sini, dan menggunakan kelewatan di sini. Benang untuk mensimulasikan proses muat turun fail~ Saya akan menulis beberapa contoh untuk anda apabila bercakap tentang rangkaian nanti~

Rendering pelaksanaan:

4.gif

Fail susun atur: activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    tools:context=".MyActivity">  
    <TextView  
        android:id="@+id/txttitle"   
        android:layout_width="wrap_content"  
         android: wrap_content  
    <!--设置一个进度条,并且设置为水平方向-->  
& lt; progressbar
android: Layout_width = "fill_parent"
android: Layout_height = "wrap_content"
android: id = "@+id/pgbar"
gaya = "? /progressBarStyleHorizontal"/>  
    <Butang  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
                                    android                                                    android   android:text="更新progressBar "/>  
</LinearLayout>

Tentukan operasi kelewatan, digunakan untuk mensimulasikan muat turun:

DelayOperator kelas awam {
//Operasi kelewatan, digunakan untuk mensimulasikan muat turun
kelewatan kekosongan awam ()
{
cuba {
Thread.sleep(1000
}tangkap (InterruptedException e){
e .printStackTrace();;
}  
}
}

AsyncTask Tersuai:

kelas awam MyAsyncTask memanjangkan AsyncTask<Integer,Integer,String>
{
txt TextView peribadi; )
                                                          🎜> //Kaedah ini tidak berjalan dalam Dalam urutan UI, ia digunakan terutamanya untuk operasi panggilan tak segerak pada 🎜 (menerbitkan secara serentak) //(menerbitkan operasi tanpa segerak). tarikh untuk mengendalikan UI
@Override
dilindungi String doInBackground(Integer... params) {
DelayOperator dop = DelayOperator(); int i = 0;
untuk (i = 10;i <= 100;i+= 10)
{
dop.de lay();
publishprogress (i);

// Tetapan kawalan
@Override
protected void onPreExecute() {
txt.setText("Start executing asynchronous thread~") }


//indoBackground Dalam kaedah, kaedah akan dicetuskan setiap kali kaedah publishProgress dipanggil
//Berjalan dalam urutan UI, anda boleh mengendalikan kawalan UI


@. Override
protected void onProgressUpdate(Integer.. . values) {
        int value = values[0];  
        pgbar.setProgress(value);  
    }  
}

MainActivity.java

kelas awam MyActivity melanjutkan ActionBarActivity {>    <🎜 txttitle;  
    pribadi ProgressBar pgbar;  
    butang peribadi btnkemas kini;  
  
    @Override  
    dilindungi void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        txttitle = (TextView)findViewById(R.id.txttitle);  
        pgbar = (ProgressBar)findViewById(R.id.pgbar);  
        btnupdate = (Button)findViewById(R.id.btnupdate);  
        btnupdate.setOnClickListener(new View.OnClickListener() {  
            @Override   
                                                                                                                                MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);  
                myTask.execute (1000);  
            }  
        });  
    }  
}


本节小结:

好的,本节一开始给大家家珲程,线程,多线程,异步,同步的概念;接着又讲解 android 操作用的较多,后面在讲解网络操作时会用到这个AsyncTask,敬请期待~本节就到这><远这个AsyncTask,敬请期待~本节就到这><远行