2013-05-25 42 views
14

Tôi có một số EditTexts mà người dùng nhập vào địa chỉ ftp, tên người dùng, mật khẩu, cổng và nút testConnection. Nếu một kết nối được estabished thành công, nó trả về giá trị boolean là true.Làm cách nào để trả lại boolean từ AsyncTask?

boolean status = ftpConnect(_address, _username, _password,_port); 
       ftpDisconnect(); 

       if (status == true) { 
       Toast.makeText(SiteManager.this, "Connection Succesful", 
       Toast.LENGTH_LONG).show(); 
       } else { 
       Toast.makeText(SiteManager.this, 
       "Connection Failed:" + status, Toast.LENGTH_LONG).show(); 

       } 

Tôi đang làm lại mã để sử dụng AsyncTasks để thực hiện các hoạt động ftp khác nhau, nhưng làm cách nào tôi có thể trả về giá trị logic nếu kết nối được thực hiện thành công?

testConnection.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       _name = etSitename.getText().toString(); 
       _address = etAddress.getText().toString(); 
       _username = etUsername.getText().toString(); 
       _password = etPassword.getText().toString(); 
       _port = Integer.parseInt(etPort.getText().toString()); 

       AsyncConnectTask task = new AsyncConnectTask(SiteManager.this, 
         _address, _username, _password, _port); 
       task.execute(); 
       // boolean status = ftpConnect(_address, _username, _password, 
       // _port); 
       // ftpDisconnect(); 

       // if (status == true) { 
       // Toast.makeText(SiteManager.this, "Connection Succesful", 
       // Toast.LENGTH_LONG).show(); 
       // savesite.setVisibility(0); 
       // } else { 
       // Toast.makeText(SiteManager.this, 
       // "Connection Failed:" + status, Toast.LENGTH_LONG) 
       // .show(); 

       // } 
      } 
     }); 

Và AsyncTask tôi

public class AsyncConnectTask extends AsyncTask<Void, Void, Void> { 
    private Context mContext; 
    private FTPHelper ftpHelper = new FTPHelper(); 
    private String _address; 
    private String _user; 
    private String _pass; 
    private int _port; 
    ProgressDialog progressDialog; 

    public AsyncConnectTask(Context context, String address, String user, 
      String pass, int port) { 
     mContext = context; 
     _address = address; 
     _user = user; 
     _pass = pass; 
     _port = port; 
    } 

    // declare other objects as per your need 
    @Override 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(mContext, "Please wait for ", 
       "Process Description Text", true); 

     // do initialization of required objects objects here 
    }; 

    @Override 
    protected Void doInBackground(Void... params) { 

     boolean status = ftpHelper.ftpConnect(_address, _user, _pass, _port); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 
    }; 
} 
+0

bạn muốn giá trị trạng thái quay lại Chủ đề giao diện người dùng? – Blackbelt

+0

Có. Điều đó có thể không? – RapsFan1981

Trả lời

30
public interface MyInterface { 
    public void myMethod(boolean result); 
} 

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> { 

    private MyInterface mListener; 


    public AsyncConnectTask(Context context, String address, String user, 
     String pass, int port, MyInterface mListener) { 
     mContext = context; 
     _address = address; 
     _user = user; 
     _pass = pass; 
     _port = port; 
     this.mListener = mListener; 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     .... 
     return result; 
    } 


    @Override 
    protected void onPostExecute(Boolean result) { 
     if (mListener != null) 
      mListener.myMethod(result); 
    } 
} 

AsyncConnectTask task = new AsyncConnectTask(SiteManager.this, 
         _address, _username, _password, _port, new MyInterface() { 
    @Override 
    public void myMethod(boolean result) { 
     if (result == true) { 
      Toast.makeText(SiteManager.this, "Connection Succesful", 
      Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(SiteManager.this, "Connection Failed:" + status, Toast.LENGTH_LONG).show(); 
     } 
    } 
}); 

task.execute(); 

Nếu bạn gọi myMethod từ onPostExecute mã bên trong nó sẽ chạy trên Chủ đề giao diện người dùng. Nếu không, bạn cần phải đăng một Runnable thông qua một Handler

+0

Tôi đã kết thúc bằng cách sử dụng câu trả lời của bạn bởi vì tôi thực sự thích cách tiếp cận này. – RapsFan1981

+1

Tôi thích triển khai mẫu delagete và không dựa vào ngữ cảnh – Blackbelt

+0

Tôi đã học được điều gì đó mới mẻ hôm nay. – Grigor

11
public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> { 

@Override 
    protected Boolean doInBackground(Void... params) { 
       .... 
       return true; /* or false */ 
} 


@Override 
    protected void onPostExecute(Boolean result) { 
      // result holds what you return from doInBackground 
    } 
} 
11

Khai AsyncTask của bạn như

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> 

Tham số thứ ba là tham số kết quả được trả về bởi doinbackground. (Người đầu tiên là AsyncTask param và thứ hai là tham số tiến)

nên làm của bạn ở chế độ nền và onpostexecute sẽ

@Override 
protected Boolean doInBackground(Void... params) { 

    boolean status = ftpHelper.ftpConnect(_address, _user, _pass, _port); 
    return status; 
} 

@Override 
protected void onPostExecute(Boolean result) { 
    // use the result 
    super.onPostExecute(result); 
    progressDialog.dismiss(); 
}; 

Hãy nhớ rằng giá trị trả về bởi doInBackground được cathced bởi onPostExecute như tham số. vì vậy hãy sử dụng phương thức này trong phương thức onPostExecute. bạn cũng có thể cập nhật giao diện người dùng của mình bằng phương pháp này.

+0

Cảm ơn! Phải đợi thêm 3 phút trước khi tôi có thể chấp nhận câu trả lời này. Cảm ơn bạn đã giải thích – RapsFan1981

+0

bạn được chào đón :) – stinepike

Các vấn đề liên quan