ข้อโต้แย้งใดที่ถูกส่งผ่านไปยัง AsyncTask <arg1, arg2, arg3>


157

ฉันไม่เข้าใจสิ่งที่ฉันควรจะใส่ที่นี่และข้อโต้แย้งเหล่านี้จบลงที่ไหน? ฉันควรจะใส่อะไรดีและมันจะไปที่ไหน ฉันต้องรวมทั้ง 3 รายการหรือรวม 1,2,20 อันด้วยหรือไม่

คำตอบ:


496

เอกสาร Android ของ Google กล่าวว่า:

งานอะซิงโครนัสถูกกำหนดโดยประเภททั่วไป 3 ประเภทที่เรียกว่า Params, Progress และ Result และ 4 ขั้นตอนที่เรียกว่า onPreExecute, doInBackground, onProgressUpdate และ onPostExecute

ประเภททั่วไปของ AsyncTask:

สามประเภทที่ใช้โดยงานอะซิงโครนัสมีดังต่อไปนี้:

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

ไม่ใช่ทุกชนิดที่ใช้โดยงานอะซิงโครนัส หากต้องการทำเครื่องหมายประเภทที่ไม่ได้ใช้ให้ใช้ประเภท Void:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

คุณสามารถอ้างอิงเพิ่มเติมได้ที่: http://developer.android.com/reference/android/os/AsyncTask.html

หรือคุณสามารถล้างบทบาทของ AsyncTask โดยอ้างอิงบล็อกของ Sankar-Ganesh

โครงสร้างของคลาส AsyncTask โดยทั่วไปมีลักษณะดังนี้:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

วิธีการนี้จะถูกดำเนินการก่อนที่จะเริ่มหัวข้อใหม่ ไม่มีค่าอินพุต / เอาต์พุตดังนั้นให้เริ่มต้นตัวแปรหรือสิ่งที่คุณคิดว่าคุณต้องทำ

    protected Z doInBackground(X...x){

    }

วิธีการที่สำคัญที่สุดในคลาส AsyncTask คุณต้องวางทุกสิ่งที่คุณต้องการทำในพื้นหลังในชุดข้อความที่แตกต่างจากชุดหลัก ที่นี่เรามีค่าอินพุตอาร์เรย์ของออบเจกต์จากประเภท“ X” (คุณเห็นในส่วนหัวหรือไม่เรามี“ ... ขยาย AsyncTask” นี่คือประเภทของพารามิเตอร์อินพุต) และส่งคืนออบเจ็กต์จากประเภท “Z”

   protected void onProgressUpdate(Y y){

   }

วิธีการนี้เรียกว่าใช้วิธีการ publishProgress (y) และมักจะใช้เมื่อคุณต้องการแสดงความคืบหน้าหรือข้อมูลใด ๆ ในหน้าจอหลักเช่นแถบความคืบหน้าแสดงความคืบหน้าของการดำเนินการที่คุณกำลังทำอยู่ในพื้นหลัง

  protected void onPostExecute(Z z){

  }

วิธีการนี้เรียกว่าหลังจากการดำเนินการในพื้นหลังเสร็จสิ้น ในฐานะที่เป็นพารามิเตอร์อินพุตคุณจะได้รับพารามิเตอร์เอาต์พุตของวิธี doInBackground

แล้วประเภท X, Y และ Z ล่ะ

ในขณะที่คุณสามารถอนุมานจากโครงสร้างด้านบน:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

เราจะเรียกภารกิจนี้จากชั้นเรียนภายนอกได้อย่างไร เพียงแค่มีสองบรรทัดต่อไปนี้:

MyTask myTask = new MyTask();

myTask.execute(x);

โดยที่ x คือพารามิเตอร์อินพุตของชนิด X

เมื่อเราทำงานของเราเรียบร้อยแล้วเราสามารถทราบสถานะได้จาก“ ภายนอก” ใช้วิธีการ“ getStatus ()”

 myTask.getStatus();

และเราสามารถรับสถานะต่อไปนี้:

RUNNING - ระบุว่างานกำลังรันอยู่

การค้าง - ระบุว่ายังไม่ได้ดำเนินการงาน

เสร็จสิ้น - ระบุว่า onPostExecute (Z) เสร็จสิ้นแล้ว

คำแนะนำเกี่ยวกับการใช้ AsyncTask

  1. อย่าเรียกใช้เมธอดบน PreExecute, doInBackground และ onPostExecute ด้วยตนเอง สิ่งนี้จะทำโดยอัตโนมัติโดยระบบ

  2. คุณไม่สามารถเรียก AsyncTask ภายใน AsyncTask หรือ Thread อื่นได้ การเรียกใช้เมธอด execute ต้องทำใน UI Thread

  3. เมธอด onPostExecute ถูกเรียกใช้งานใน UI Thread (ที่นี่คุณสามารถเรียก AsyncTask อื่น!)

  4. พารามิเตอร์อินพุตของงานสามารถเป็นอาร์เรย์วัตถุได้ด้วยวิธีนี้คุณสามารถใส่วัตถุและประเภทใดก็ได้ที่คุณต้องการ


20
คำอธิบายที่สมบูรณ์แบบเพื่อน
Kalai.G

30
ดีกว่า Google
Diolor

25
+1 ดังนั้นสมาชิกรับทราบ นี่คือวิธีที่คุณอธิบาย แม้ว่าจะยาว แต่ก็เข้าใจง่ายมาก ขอบคุณ Kartik
Subby

3
คำอธิบายที่ดีตอนนี้ฉันชัดเจนมากเกี่ยวกับ Asyntask :) ขอบคุณ Kartik
Reena

2
นั่นเป็นการเคลียร์สิ่งต่าง ๆ มากมายสำหรับฉันคำตอบที่ยอดเยี่ยม!
Michael

80

ฉันไปงานปาร์ตี้สายเกินไป แต่คิดว่าอาจช่วยคนอื่นได้


7
ภาพนี้มีประโยชน์มาก ฉันจะเริ่มใช้ภาพเพิ่มเติมเช่นนี้เพื่อแสดงว่าประเภทและตัวแปรที่เกี่ยวข้องเชื่อมโยงกันอย่างไรเมื่อการไหลของรหัสไม่ตรงไปตรงมาหรือเทคนิคหรือรูปแบบผิดปกติ ฉันหวังว่าคนอื่นจะทำมากกว่านี้ ขอบคุณ
Kent Lauridsen

ภาพที่ดีคุณช่วยเพิ่ม WeakAsyncTask ด้วยได้ไหม?
kAmol

1
@kAmol แน่ใจว่าฉันจะพยายามทำให้WeakAsyncTaskเป็นอย่างดี
mrid

4
วันหนึ่งฉันจะทำสิ่งนี้และวางไว้บนผนังของฉันดังนั้นฉันไม่ต้องกลับมาที่กระทู้นี้เพื่ออ้างอิงอีก
Matt Robertson

14

ง่าย ๆ เข้าไว้!

AsyncTaskเป็นงานพื้นหลังที่วิ่งในหัวข้อพื้นหลัง มันจะใช้เวลาการป้อนข้อมูลดำเนินการความคืบหน้าและให้เอาท์พุท

AsyncTask<Input,Progress,Output>กล่าวคือ

AsyncTaskในความคิดของแหล่งที่มาหลักของความสับสนมาเมื่อเราพยายามที่จะจดจำพารามิเตอร์ในการ
ที่สำคัญคืออย่าจดจำ
หากคุณสามารถเห็นภาพสิ่งที่งานของคุณต้องทำจริง ๆ แล้วเขียนAsyncTaskด้วยลายเซ็นที่ถูกต้องจะเป็นชิ้นส่วนของเค้ก
เพียงแค่คิดออกว่าคุณป้อนข้อมูล , ความคืบหน้าและเอาท์พุทและคุณจะดีไป

ตัวอย่างเช่น: ป้อนคำอธิบายรูปภาพที่นี่

หัวใจของ AsyncTask!

doInBackgound()method เป็นวิธีที่สำคัญที่สุดในการAsyncTaskเพราะ

  • เฉพาะวิธีการนี้ทำงานในเธรดพื้นหลังและเผยแพร่ข้อมูลไปยังเธรด UI
  • การเปลี่ยนแปลงลายเซ็นของมันกับAsyncTaskพารามิเตอร์

ลองดูความสัมพันธ์กัน

ป้อนคำอธิบายรูปภาพที่นี่

doInBackground()และonPostExecute(), onProgressUpdate()ที่เกี่ยวข้องยัง

ป้อนคำอธิบายรูปภาพที่นี่

แสดงรหัสให้ฉัน
ดังนั้นฉันจะเขียนรหัสสำหรับ DownloadTask ได้อย่างไร

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

คุณจะรันงานนี้อย่างไร

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementsเป็นเพียงคำอธิบายที่ตรงไปตรงมาที่สุดสำหรับonProgressUpdate(...):)
Volkan Güven

5

อ้างอิงถึงลิงค์ต่อไปนี้:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

คุณไม่สามารถส่งผ่านอาร์กิวเมนต์ได้มากกว่าสามข้อหากคุณต้องการส่งเพียงอาร์กิวเมนต์ 1 ข้อให้ใช้ช่องว่างสำหรับอีกสองข้อโต้แย้ง

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

งานอะซิงโครนัสถูกกำหนดโดยการคำนวณที่รันบนเธรดพื้นหลังและผลลัพธ์ถูกเผยแพร่บนเธรด UI งานอะซิงโครนัสถูกกำหนดโดยประเภททั่วไป 3 ประเภทที่เรียกว่า Params, Progress และ Result และ 4 ขั้นตอนที่เรียกว่า onPreExecute, doInBackground, onProgressUpdate และ onPostExecute

KPBird


3
  • ในระยะสั้นมี 3 พารามิเตอร์ใน AsyncTask

    1. พารามิเตอร์สำหรับการใช้งานอินพุตใน DoInBackground (สตริง ... params)

    2. พารามิเตอร์สำหรับแสดงสถานะความคืบหน้าของการใช้งานใน OnProgressUpdate (สถานะสตริง ... )

    3. พารามิเตอร์สำหรับการใช้ผลลัพธ์ใน OnPostExcute (ผลลัพธ์สตริง ...

    หมายเหตุ: - [ประเภทของพารามิเตอร์สามารถแตกต่างกันไปตามความต้องการของคุณ]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.