簡體   English   中英

在Android中停止AsyncTask doInBackground方法

[英]Stop AsyncTask doInBackground Method in Android

我遇到了AsyncTask doInBackground方法的問題,我不知道如何停止此方法的運行。

我正在使用一個具有登錄屏幕的應用程序,該屏幕可以檢索有關登錄用戶的信息。 問題是當我輸入了錯誤的密碼或用戶名,然后當我重新輸入正確的數據時,我的應用程序崩潰了,我得到了

“ java.lang.IllegalStateException:無法執行任務:任務已經執行”

如何停止該線程運行? 這是代碼:

LoginActivity.java

public class LoginActivity extends Activity implements LoginParser.GetLoginListener{


    public LoginParser parser1;
    public EditText ETUsername;
    public  EditText ETPassword;
    //private LoginParser lb;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);


      parser1 = new LoginParser();

        ETUsername = (EditText)findViewById(R.id.ET1);
        ETPassword = (EditText)findViewById(R.id.ET2);

        final Button button = (Button) findViewById(R.id.loginBut);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                String UserName = ETUsername.getText().toString();
                String Password = ETPassword.getText().toString();
                Log.e("LoginAct .. userName: ", UserName);
                Log.e("LoginAct .. Password: ", Password);

                if (UserName.isEmpty() || Password.isEmpty()) {
                    new AlertDialog.Builder(LoginActivity.this).setTitle("Warning")
                            .setMessage("Please Enter your Username and Password")
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                }
                            }).show();
                }

                else{

                    parser1.getLoginInfo(UserName, Password);
                    parser1.setListener(LoginActivity.this);
                }
            } // end of button on click
        } );
}

    @Override
    public void didReceivedUserInfo(String displayName) {

        if(displayName != null) {

                        new AlertDialog.Builder(LoginActivity.this).setTitle("Welcome").setMessage("Welcome " + displayName)
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent in = new Intent (LoginActivity.this, MainActivity.class);
                                        startActivity(in);
                                    }
                                }).show();
                    }

                else {

                    new AlertDialog.Builder(LoginActivity.this).setTitle("Warning")
                            .setMessage("Error in login ID or Password, Please try again later")
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {

                                }
                            }).show();
                }
  }
}

LoginParser.java

  public class LoginParser extends AsyncTask <Void,Void,String> {

    private String requestURL;

    public  String UserName ;
    public  String Password ;



    public interface GetLoginListener
    {
        public void didReceivedUserInfo (String displayName);
    }

    private GetLoginListener listener;


    public GetLoginListener getListener() {
        return listener;
    }

    public void setListener(GetLoginListener listener) {
        this.listener = listener;
    }


    public void getLoginInfo(String userName , String password)
    {
        requestURL = "some link";

        this.UserName = userName ;
        this.Password = password ;

        execute(); // it will call doInBackground in secondary thread
    }




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

        try {

            URL url = new URL(requestURL);

            HttpURLConnection urlConnection1 = (HttpURLConnection) url.openConnection();


            String jsonString = "LID="+ UserName +"&PWD="+Password+"&Passcode=****";
            Log.e("LoginParser","JSONString: " + jsonString);


            urlConnection1.setDoOutput(true);
            urlConnection1.setRequestMethod("POST");
           urlConnection1.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
             urlConnection1.setRequestProperty("charset","utf-8");


            PrintWriter out = new PrintWriter(urlConnection1.getOutputStream());
            // out.print(this.requestMessage);
            out.print(jsonString);
            out.close();

            int statusCode = urlConnection1.getResponseCode();
            Log.d("statusCode", String.valueOf(statusCode));
            StringBuilder response = new StringBuilder();

            byte[] data = null;

            if (statusCode == HttpURLConnection.HTTP_OK)
            {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection1.getInputStream()));

                String line;

                while ((line = r.readLine()) != null) {
                    response.append(line);
                }

                data = response.toString().getBytes();
            }

            else {

                data = null;// failed to fetch data
            }

            String responseString = new String(data);
            Log.e("doInBackground", "responseString" + responseString);

            JSONObject jsonObject2 = new JSONObject(responseString);
            String Status = jsonObject2.getString("Status");
            Log.e("Status", Status);

            if (Status.equals("s")) {


                Log.i("Status:", "Successful");

                String displayName = jsonObject2.getString("DisplayName");


                return displayName;
            }

            else {

                return null;

            }

        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String displayName) {
        super.onPostExecute(displayName);

        Log.e("onPost: ","onPost");
        listener.didReceivedUserInfo(displayName);
    }
}

謝謝您的幫助。

可以通過創建AsyncTask的新實例來解決“無法重新執行任務”錯誤。 您不能在同一實例上兩次調用execute,但是可以根據需要創建任意多個實例。

停止執行不會幫助該錯誤。 問題不在於它當前正在運行,而是在於您需要創建一個新實例並運行它。

您可以在doInBackground方法中使用isCancel的連續檢查來取消Async任務。

protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM