>Java >java지도 시간 >Android AsyncTask에서 부울 값을 올바르게 반환하는 방법은 무엇입니까?

Android AsyncTask에서 부울 값을 올바르게 반환하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 10:38:10656검색

How to Properly Return a Boolean Value from an Android AsyncTask?

AsyncTask에서 부울 값을 반환하는 방법

Android 프로그래밍에서 AsyncTask는 별도의 스레드에서 백그라운드 작업을 수행하도록 설계된 클래스입니다. 이러한 맥락에서 비동기 작업이 비동기적으로 작동하기 때문에 부울 값을 반환해야 할 때 문제가 발생합니다.

FTP 주소, 사용자 이름, 비밀번호에 대해 EditTexts가 있는 사용자 인터페이스가 있는 시나리오를 생각해 보세요. 그리고 항구. 사용자가 "testConnection" 버튼을 클릭하면 연결이 시도되고 연결 상태에 따라 부울 값이 반환됩니다.

비동기 작업에서 부울 반환에 대한 도전

처음에는 코드가 제공된 예제와 유사해 보일 수 있습니다.

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();

 } 

그러나 언제 AsyncTask를 사용하면 doInBackground 내의 코드가 백그라운드에서 실행되고, 백그라운드 작업 결과에 관계없이 onPostExecute 메서드가 호출됩니다. 이는 onPostExecute 메소드에서 부울 상태를 사용할 수 없음을 의미합니다.

해결책: 콜백 인터페이스 구현

이 문제를 극복하기 위해 콜백 인터페이스를 구현할 수 있습니다. . 방법은 다음과 같습니다.

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();

이 접근 방식을 사용하면 doInBackground의 결과가 콜백 인터페이스를 통해 UI 스레드로 다시 전달됩니다. onPostExecute에서 myMethod를 호출하여 UI 스레드에서 코드를 실행할 수 있습니다. 그렇지 않으면 핸들러를 통해 Runnable을 게시해야 합니다.

위 내용은 Android AsyncTask에서 부울 값을 올바르게 반환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.