gpt4 book ai didi

调用 AsynchTask.get() 时 Android UI 线程阻塞

转载 作者:行者123 更新时间:2023-11-29 21:48:50 24 4
gpt4 key购买 nike

我的 Activity 是一个登录页面。当用户单击时,asyncTask 会在数据库中检查凭据是否正确。在任务期间,我想显示一个 ProgressDialog,但在单击按钮后,它会保持按下状态 5 秒钟,然后我的 ProgressDialog 快速显示(不到 1 秒)并且出现 toast。

有我的 onClick 函数:

Button connect = (Button)findViewById(R.id.connectButton);
final EditText loginED = (EditText) findViewById(R.id.login);
final EditText passwordED = (EditText) findViewById(R.id.password);

connect.setOnClickListener(new View.OnClickListener(){

@Override
public void onClick(View arg0) {

String login = loginED.getText().toString();
String password = passwordED.getText().toString();
String[] params = {login, password};

DoAsyncLogin doAsyncLogin = new DoAsyncLogin();
try {
String result = doAsyncLogin.execute(params).get();
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
});

还有我的异步任务:

private class DoAsyncLogin extends AsyncTask<String, Void, String>
{
ProgressDialog connectionProgressDialog = new ProgressDialog(MainActivity.this);

@Override
protected String doInBackground(String... params) {
return getLoginData(params);
}

protected void onPreExecute(){

connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
connectionProgressDialog.setMessage("Logging in...");
connectionProgressDialog.show();
}

protected void onPostExecute(String result)
{
connectionProgressDialog.dismiss();
}
}

有什么想法吗?

谢谢!

最佳答案

问题是您正在等待(阻塞)AsynchTask 完成其在主线程上的执行(这使其无用):在此处查看 AsynchTask get 方法的文档:AsynchTask.get()

相反,您应该使用 onPostExcute 回调来获取结果。

代码:

@Override
public void onClick(View arg0) {

String login = loginED.getText().toString();
String password = passwordED.getText().toString();
String[] params = {login, password};

DoAsyncLogin doAsyncLogin = new DoAsyncLogin();
doAsyncLogin.execute(params);
}

在你的异步任务中:

protected void onPostExecute(String result){
connectionProgressDialog.dismiss();
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
}

关于调用 AsynchTask.get() 时 Android UI 线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15001726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com