0

我正在开发一个使用 AsyncTask 的应用程序。我正在尝试连接到我的网站,检查用户登录详细信息,如果用户存在则返回 true,如果找不到则返回 false。根据响应,我将显示一条错误消息或为用户加载相关屏幕。

但是我想知道下面的代码是否应该放在我的登录按钮的 onClick 侦听器中或 AsyncTask 的 onPreExecute() 方法中?

我这样调用 asyncTask

public void onClick(View v) {
            //Call background task
            new HttpTask().execute(url);
        }
    });

我在哪里调用下面的代码有关系吗?理想情况下应该在 onPreExecute() 方法中吗?

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.mysite.com/checklogindetails.php");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("username", name));
    nameValuePairs.add(new BasicNameValuePair("password", pass));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
} catch (IOException e) {
    // TODO Auto-generated catch block
}

感谢您提供有关此人的任何信息。这不是问题,这对我来说更像是一个学习曲线,我很好奇我应该做什么。

谢谢。

4

1 回答 1

4

您的 HTTP 代码需要在doInBackground()方法中,否则它仍然在主 (UI) 线程中运行,并且可能会导致新 Android 版本出现异常(更不用说如果您的请求需要很长时间的锁定)。

这是一个示例(注意构造函数添加)我决定将对保留在doInBackground(). 由于您没有向我们提供所有代码,因此这可能无法立即工作。

public class LoginTask extends AsyncTask <String, Void, Boolean>{

  private String name = "", pass= "";
  public LoginTask (String name, String pass )
  {
    super();
    this.name = name;
    this.pass = pass;
  }
  @Override
  protected Boolean  doInBackground (String...url)
  { 
    boolean good = true;

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url[0]);

    try {
      // Add your data
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
      nameValuePairs.add(new BasicNameValuePair("username", name));
      nameValuePairs.add(new BasicNameValuePair("password", pass));
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

      // Execute HTTP Post Request
      HttpResponse response = httpclient.execute(httppost);


    } catch (ClientProtocolException e) {
      good = false;
    } catch (IOException e) {
      good = false;
    }
    return good;
  }

  @Override
  protected void onPostExecute (Boolean result)
  {
    Toast.makeText(MainActivity.this, result ? "Logged in": "Problem", Toast.LENGTH_SHORT).show();
  }
}

你会打电话给使用

public void onClick(View v) {
            //Call background task
            new HttpTask("myusername", "mypassword").execute(url);
        }
    });
于 2013-01-19T23:37:35.490 回答