【问题标题】:Android UI Thread Block when calling AsynchTask.get()调用 AsynchTask.get() 时的 Android UI 线程块
【发布时间】:2013-02-21 11:59:37
【问题描述】:

我的活动是一个登录页面。当用户单击时,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();
    }
   }
});

还有我的 AsyncTask :

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

有什么想法吗?

谢谢!

【问题讨论】:

    标签: android multithreading android-asynctask ui-thread


    【解决方案1】:

    问题是您正在等待(阻塞) AsynchTask 完成它在主线程上的执行(这使它无用): 在此处查看 AsynchTask 获取方法的文档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);
    }
    

    在你的 asynchTask 中:

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

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多