Завершить задание в асинитаске - PullRequest
0 голосов
/ 08 октября 2018

Привет, я сейчас работаю над Android MySQL для моего мобильного приложения libary, но Как я могу закрыть активность входа в систему после входа в систему, context .finish ();не работает вот мои коды. я знаю в обычном намерении его только отделка ();но как я могу сделать это в моем коде.

моя asyntask:

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

    Context context;
    AlertDialog alertDialog;

    String result;

    backgroundWorker(Context ctx) {
        context = ctx;
    }

    ProgressDialog progressDialog;

    @Override
    protected String doInBackground(String... params) {
        String type = params[0];
        String login_url = "http://192.168.254.120/LibrayAPI/Signin.php";

        if (type.equals("login")) {


            String user_name = params[1];
            String password = params[2];


            try {

                String data = URLEncoder.encode("user_name", "UTF-8") + "=" +
                        URLEncoder.encode(user_name, "UTF-8");
                data += "&" + URLEncoder.encode("password", "UTF-8") + "=" +
                        URLEncoder.encode(password, "UTF-8");
                URL url = new URL(login_url);
                URLConnection conn = url.openConnection();

                conn.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter((conn.getOutputStream()));

                wr.write(data);
                wr.flush();

                BufferedReader reader = new BufferedReader(new
                        InputStreamReader(conn.getInputStream()));

                StringBuilder sb = new StringBuilder();
                String line;
                //Read server response
                while ((line = reader.readLine()) != null) {

                    sb.append(line);
                    break;
                }
                return sb.toString();

            } catch (Exception e) {
                return new String("Exeption" + e.getMessage());
            }
        }

        return null;
    }

    @Override
    protected void onPreExecute() {
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Log in Status");
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage("\tLoading");
        progressDialog.show();
    }

    @Override
    protected void onPostExecute(String result) {
         progressDialog.dismiss();
        alertDialog.setMessage(result);
        alertDialog.show();

        if (result.equals("Log in sucessful")) {
            alertDialog.dismiss();
            Intent todash = new Intent(context, DashBoard.class);
            context.startActivity(todash);

        } else {
        }

    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
}

Войти Активность:

public class Login extends AppCompatActivity {

    EditText username,password;

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

        username = findViewById(R.id.edtUsername);
        password = findViewById(R.id.edtPassword);
    }

    public void onLogin(View view) {

        String Username = username.getText().toString();
        String Password = password.getText().toString();
        //notif call
//call notif for overdue tommorow
        backWorkerNotifTom backWorkerNotifTom = new backWorkerNotifTom(this);
        //get datetime tom
        Calendar calendar =  Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR,1);
        Date dateTom = calendar.getTime();
        SimpleDateFormat sf1 = new SimpleDateFormat("yyyy-MM-dd");
        String dateTomString = sf1.format(dateTom);
        Toast.makeText(this, dateTomString, Toast.LENGTH_SHORT).show();
        backWorkerNotifTom.execute("SelectNotifTom",dateTomString,Username);

        backWorkerNotif backWorkerNotif = new backWorkerNotif(this);
        Date date = Calendar.getInstance().getTime();
        SimpleDateFormat SF = new SimpleDateFormat("yyyy-MM-dd");
        String DateNow = SF.format(date);
        backWorkerNotif.execute("Notif", DateNow, Username);

        String Type = "login";
        GlobalVariable.BorrowerID = Username;
        GlobalVariable.Password = Password;
        backgroundWorker _backgroundWorker = new backgroundWorker(this);
        _backgroundWorker.execute(Type, Username, Password);


    }
}

PS: похоже, я новичок в Android.

Ответы [ 6 ]

0 голосов
/ 08 октября 2018

Другим способом обработки является создание интерфейса и уведомление вызывающего абонента, как только асинхронное выполнение выполнит свою задачу.

  public interface asyncTaskStatusListener {
        void onfinishTask();
    }

// выполните вход в систему для реализации интерфейса

  public class Login extends AppCompatActivity implements asyncTaskStatusListener {

    @Override
     public void onfinishTask() {
      finish();
   }
 }

   //Create your background class constructor which takes interface reference.
   backgrounderWorker = new backgroundworker(asyncTaskStatusListener callback);

    //In post execute method call 
    callback.onfinishTask();
0 голосов
/ 08 октября 2018

Вы можете передать WeakReference в AsyncTask, это позволит избежать возможных утечек контекста.Вы можете достичь этого следующим образом:

public class MyAsynctask extends AsyncTask<Void, Void, Void> {

    private WeakReference<Activity> mWeakContext;

    public MyAsynctask(WeakReference<Activity> reference) {
        mWeakContext = reference;
    }

    @Override
    protected String doInBackground(String... params) {
        // Do your work
    }

    @Override
    protected void onPostExecute(String result) {
        Activity activity = mWeakContext.get();
        if (activity != null) {
            activity.finish();
        }
    }
}
0 голосов
/ 08 октября 2018

Просто добавьте только одну строку, чтобы завершить. Войдите в систему. .....

 @Override
     protected void onPostExecute(String result) {
          progressDialog.dismiss();
          alertDialog.setMessage(result);
          alertDialog.show();
          if (result.equals("Log in sucessful")) {
               alertDialog.dismiss();
               ((Activity)context).finish();//just add this line of code
               Intent todash = new Intent(context, DashBoard.class);
               context.startActivity(todash);

          } else {
              //do your work
          }

     }
0 голосов
/ 08 октября 2018

Если вы хотите завершить Activity из AsyncTask, вам нужно передать ссылку Activity в конструкторе AsyncTask.

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

    private Activity mActivity;
    Context context;
    AlertDialog alertDialog;

    String result;

    backgroundWorker(Activity activity) {
        context = activity.getApplicationContext();
        mActivity = activity;
    }

    ......

    protected void onPostExecute(String result) {
        //do your job
        mActivity.finish();
        ....
    }
}
0 голосов
/ 08 октября 2018

Самый простой способ завершить вашу активность из AsyncTask - это изменить ваш тип контекста:

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

    Login context;
    AlertDialog alertDialog;

    String result;

    backgroundWorker(Login ctx) {
        context = ctx;
    }

    //...
}

Затем, в вашем onPostExecute() вы можете просто позвонить:

context.finish();

Вы передаете this конструктору из своей активности входа в систему, поэтому вам не нужно менять способ создания задачи.Это означает, что ваша AsyncTask может быть создана только из этого действия, но это, вероятно, все, что вам нужно.

0 голосов
/ 08 октября 2018

Попробуйте использовать Activity вместо Context

Activity context;
AlertDialog alertDialog;

String result;

backgroundWorker(Activity ctx) {
    context = ctx;
}

Give Login.this вместо контекста при вызове backgroundWorker

backgroundWorker _backgroundWorker = new backgroundWorker(Login.this);
...