Android : How to pass parameter into class extends AsyncTask
ปกติเวลาเราต้องการโหลดข้อมูลจากเซิร์ฟเวอร์ เราจะสร้างการเชื่อมต่อแบบ AsyncTask ไว้ใน Activity class or Fragment class เช่น
private void getDataFromServer(){
String url = ....;
new MyTask().execute(url);
}
private class MyTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
return JsonUtils.getJSONString(params[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
/* do something after get data from server */
}
}
จากตัวอย่าง url ที่ส่งเข้ามาจาก getDataFromServer() จะนำมาใช้ที่ protected String doInBackground ในที่นี้คือ params[0]
สมมติว่าโค้ดมันยาวเราอยากจะย้าย AsyncTask ออกไปจาก Activity or Fragment เราก็ไปสร้าง class ไฟล์ใหม่ได้ เช่น New->Java Class-> LoadData.java ดังตัวอย่าง
public class LoadData extends <String, String, Boolean> {
private String params;
// create constructor
public class LoadData (String params) {
this.params = params;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... args) {
// Use the params variable here
return true;
}
@Override
protected void onPostExecute(Boolean s) {
super.onPostExecute(s);
}
}
จากตัวอย่างเราสร้าง class LoadData ไว้แล้ว โดยกำหนดให้มีตัวแปรที่รับเข้ามา 1 ตัวเป็น String ใน Constructor. public class LoadData (String params) {this.params = params;} เวลาเรียกใช้ใน Activity or Fragment เราทำได้ดังนี้
private LoadData lddata;
private void getDataFromServer(){
String url = ....;
lddata = new LoadData(url);
lddata.execute();
}
url ที่เราส่งเข้าไปจะถูกเก็บในตัวแปรชื่อ params ใน LoadData class เราก็นำไปใช้ต่อได้ใน protected Boolean doInBackground().
แต่ถ้าเราไม่สร้าง Constructor เพื่อรับตัวแปรนี้เข้าไป เราสามารถส่งผ่านตัวแปรตอนที่รัน .execute(param1,param2); ได้เช่น
private void getDataFromServer(){
String url = ...;
lddata = new LoadData();
lddata.execute(url);
}
โดย url ที่ส่งเข้าไปเราจะรับที่ protected Boolean doInBackground() ดังนี้
protected Boolean doInBackground(String... args) {
String url = args[0];
// do something //
return true;
}
จากตัวอย่างเรากำหนดตัวแปรรับชื่อ args โดยตัวแปรที่ส่งมาจาก Activity or Fragment ส่ง url เข้ามาตัวเดียว เลยใช้ args[0] แต่ถ้ามีตัวแปรที่ 2,3 เข้ามา เราก็รับด้วย args[1], args[2],… ได้เลย