Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用AsynchTask.get()时Android UI线程阻塞_Android_Multithreading_Android Asynctask_Ui Thread - Fatal编程技术网

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

调用AsynchTask.get()时Android UI线程阻塞,android,multithreading,android-asynctask,ui-thread,Android,Multithreading,Android Asynctask,Ui Thread,我的活动是一个登录页面。当用户单击时,异步任务将检查数据库中的凭据是否良好。在任务期间,我想显示一个ProgressDialog,但单击按钮后,它保持按下5秒钟,然后我的ProgressDialog quiclky显示(不到1秒钟),并显示toast 这是我的onClick函数: Button connect = (Button)findViewById(R.id.connectButton); final EditText loginED = (EditText) findViewById(R

我的活动是一个登录页面。当用户单击时,异步任务将检查数据库中的凭据是否良好。在任务期间,我想显示一个ProgressDialog,但单击按钮后,它保持按下5秒钟,然后我的ProgressDialog quiclky显示(不到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();
}
}
私有类DoAsyncLogin扩展了异步任务
{
ProgressDialog connectionProgressDialog=新建ProgressDialog(MainActivity.this);
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回getLoginData(参数);
}
受保护的void onPreExecute(){
connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_微调器);
connectionProgressDialog.setMessage(“登录…”);
connectionProgressDialog.show();
}
受保护的void onPostExecute(字符串结果)
{
connectionProgressDialog.Disclose();
}
}
有什么想法吗


谢谢

问题在于,您正在等待(阻塞)异步任务在主线程上完成执行(这使得它无用): 请参阅此处有关AsynchTask get方法的文档

相反,您应该使用
onpostExecute
回调以获取结果

代码:

在asynchTask中:

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