0

AsyncTaskを使用しているアプリケーションに取り組んでいます。Webサイトに接続しようとしています。ユーザーのログイン情報を確認し、ユーザーが存在する場合は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 に答える