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],… ได้เลย

You may also like...