【问题标题】:Finish the activity intent in asynytask在 asynytask 中完成活动意图
【发布时间】:2019-03-13 05:22:38
【问题描述】:

嗨,我目前正在为我的 libary 移动应用程序开发 android mysql,但是我如何在登录后关闭登录活动,上下文 .finish();我的代码在这里不起作用。我知道正常情况下它唯一的完成(); 但我怎么能在我的代码中做到这一点。

我的异步任务:

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 新手。

【问题讨论】:

  • 您的“按钮”块:在您的活动中吗?
  • 编辑了我上面的代码
  • 登录活动就是我要完成的活动

标签: android android-intent android-asynctask activity-finish


【解决方案1】:

尝试使用 Activity 而不是 Context

Activity context;
AlertDialog alertDialog;

String result;

backgroundWorker(Activity ctx) {
    context = ctx;
}

在调用 backgroundWorker 时提供 Login.this 而不是上下文

backgroundWorker _backgroundWorker = new backgroundWorker(Login.this);

【讨论】:

    【解决方案2】:

    从 AsyncTask 完成 Activity 的最简单方法是更改​​ Context 类型:

    public class backgroundWorker extends AsyncTask<String,Void,String> {
    
        Login context;
        AlertDialog alertDialog;
    
        String result;
    
        backgroundWorker(Login ctx) {
            context = ctx;
        }
    
        //...
    }
    

    然后,在您的onPostExecute() 中,您可以调用:

    context.finish();
    

    您将this 从您的登录活动传递给构造函数,因此您无需更改构建任务的方式。这意味着您的 AsyncTask 只能从该 Activity 构造,但这可能就是您所需要的。

    【讨论】:

      【解决方案3】:

      如果您想从 AsyncTask 完成 Activity,您需要在 AsyncTask 构造函数中传递一个 Activity 引用。

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

      【讨论】:

      • 不需要两个上下文引用。
      【解决方案4】:

      只需添加一行即可完成登录活动.....

       @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
                }
      
           }
      

      【讨论】:

        【解决方案5】:

        您可以在 AsyncTask 中传递 WeakReference,这将避免可能的上下文泄漏。你可以这样实现:

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

        【讨论】:

          【解决方案6】:

          另一种处理方式是创建一个接口,并在异步完成其任务后通知调用方。

            public interface asyncTaskStatusListener {
                  void onfinishTask();
              }
          

          //让你的登录Activity实现接口

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-30
            • 1970-01-01
            • 1970-01-01
            • 2014-10-22
            • 2015-02-03
            • 1970-01-01
            • 2021-10-22
            相关资源
            最近更新 更多