ฉันไม่เข้าใจสิ่งที่ฉันควรจะใส่ที่นี่และข้อโต้แย้งเหล่านี้จบลงที่ไหน? ฉันควรจะใส่อะไรดีและมันจะไปที่ไหน ฉันต้องรวมทั้ง 3 รายการหรือรวม 1,2,20 อันด้วยหรือไม่
ฉันไม่เข้าใจสิ่งที่ฉันควรจะใส่ที่นี่และข้อโต้แย้งเหล่านี้จบลงที่ไหน? ฉันควรจะใส่อะไรดีและมันจะไปที่ไหน ฉันต้องรวมทั้ง 3 รายการหรือรวม 1,2,20 อันด้วยหรือไม่
คำตอบ:
เอกสาร 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
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
อย่าเรียกใช้เมธอดบน PreExecute, doInBackground และ onPostExecute ด้วยตนเอง สิ่งนี้จะทำโดยอัตโนมัติโดยระบบ
คุณไม่สามารถเรียก AsyncTask ภายใน AsyncTask หรือ Thread อื่นได้ การเรียกใช้เมธอด execute ต้องทำใน UI Thread
เมธอด onPostExecute ถูกเรียกใช้งานใน UI Thread (ที่นี่คุณสามารถเรียก AsyncTask อื่น!)
พารามิเตอร์อินพุตของงานสามารถเป็นอาร์เรย์วัตถุได้ด้วยวิธีนี้คุณสามารถใส่วัตถุและประเภทใดก็ได้ที่คุณต้องการ
WeakAsyncTask
เป็นอย่างดี
AsyncTask
เป็นงานพื้นหลังที่วิ่งในหัวข้อพื้นหลัง มันจะใช้เวลาการป้อนข้อมูลดำเนินการความคืบหน้าและให้เอาท์พุท
AsyncTask<Input,Progress,Output>
กล่าวคือ
AsyncTask
ในความคิดของแหล่งที่มาหลักของความสับสนมาเมื่อเราพยายามที่จะจดจำพารามิเตอร์ในการ
ที่สำคัญคืออย่าจดจำ
หากคุณสามารถเห็นภาพสิ่งที่งานของคุณต้องทำจริง ๆ แล้วเขียนAsyncTask
ด้วยลายเซ็นที่ถูกต้องจะเป็นชิ้นส่วนของเค้ก
เพียงแค่คิดออกว่าคุณป้อนข้อมูล , ความคืบหน้าและเอาท์พุทและคุณจะดีไป
doInBackgound()
method เป็นวิธีที่สำคัญที่สุดในการAsyncTask
เพราะ
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");
// show in spinner, access UI elements
เป็นเพียงคำอธิบายที่ตรงไปตรงมาที่สุดสำหรับonProgressUpdate(...)
:)
อ้างอิงถึงลิงค์ต่อไปนี้:
คุณไม่สามารถส่งผ่านอาร์กิวเมนต์ได้มากกว่าสามข้อหากคุณต้องการส่งเพียงอาร์กิวเมนต์ 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 พารามิเตอร์ใน AsyncTask
พารามิเตอร์สำหรับการใช้งานอินพุตใน DoInBackground (สตริง ... params)
พารามิเตอร์สำหรับแสดงสถานะความคืบหน้าของการใช้งานใน OnProgressUpdate (สถานะสตริง ... )
พารามิเตอร์สำหรับการใช้ผลลัพธ์ใน OnPostExcute (ผลลัพธ์สตริง ...
หมายเหตุ: - [ประเภทของพารามิเตอร์สามารถแตกต่างกันไปตามความต้องการของคุณ]