[英]Finish the activity intent in asynytask
嗨,我目前正在为我的 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:看起来我是安卓新手。
尝试使用 Activity 而不是 Context
Activity context;
AlertDialog alertDialog;
String result;
backgroundWorker(Activity ctx) {
context = ctx;
}
当您调用 backgroundWorker 时,给Login.this
不是上下文
backgroundWorker _backgroundWorker = new backgroundWorker(Login.this);
从 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 构建,但这可能就是您所需要的。
如果要从 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();
....
}
}
只需添加一行即可完成登录活动.....
@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
}
}
您可以在 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();
}
}
}
另一种处理方式是创建一个接口并在异步完成其任务后通知调用者。
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.