-1

http 投稿リクエストを介していくつかのデータを投稿し、プロセス全体を理解しようとしています。Android 開発者サイトのドキュメントを赤くしました。いくつかの YouTube チュートリアルを見てきましたが、まだよくわからない点がいくつかあります。次のログイン例のコードを見つけましたが、AsyncTask にはありませんでした。私はそれがなければならないことを知っています。しかし、私が AsyncTask でそれをやろうとすると、私のパラメータが正しく定義されておらず、立ち往生しています。httpサーバー上の.phpスクリプトにデータを渡したい場合、誰かが私を助けて実際にどのように機能するかを説明できますか? これが私のコードです:(編集後、ここにAsyncTaskでの私の試みがあります):

 public class AndroidLogin extends Activity implements OnClickListener{

Button ok,back,exit;
TextView result;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_android_login);

 // Login button clicked
    ok = (Button)findViewById(R.id.btn_login);
    ok.setOnClickListener(this);

    result = (TextView)findViewById(R.id.lbl_result);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_android_login, menu);
    return true;
}

private class Login extends AsyncTask <String,String,String>{

    @Override
    protected String doInBackground(String... params) {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();

        /* login.php returns true if username and password is equal to saranga */
        HttpPost httppost = new HttpPost("http://www.mysite.com/login.php");

        try {
            // Add user name and password
         EditText uname = (EditText)findViewById(R.id.txt_username);
         String username = uname.getText().toString();

         EditText pword = (EditText)findViewById(R.id.txt_password);
         String password = pword.getText().toString();

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("username", username));
            nameValuePairs.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            Log.w("SENCIDE", "Execute HTTP Post Request");
            HttpResponse response = httpclient.execute(httppost);

            String str = inputStreamToString(response.getEntity().getContent()).toString();
            Log.w("SENCIDE", str);

            if(str.toString().equalsIgnoreCase("true"))
            {
             Log.w("SENCIDE", "TRUE");
             result.setText("Login successful");   
            }else
            {
             Log.w("SENCIDE", "FALSE");
             result.setText(str);             
            }

        } catch (ClientProtocolException e) {
         e.printStackTrace();
        } catch (IOException e) {
         e.printStackTrace();
        }

        StringBuilder inputStreamToString(InputStream is); 
            String line = "";
            StringBuilder total = new StringBuilder();
            // Wrap a BufferedReader around the InputStream
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            // Read response until the end
            try {
             while ((line = rd.readLine()) != null) { 
               total.append(line); 
             }
            } catch (IOException e) {
             e.printStackTrace();
            }
            // Return full string
            return total;

        return null;
    }


}

public void onClick(View view) {

    new Login().execute();
}

}

4

1 に答える 1

0

まず、メソッド シグネチャは、配列である必要があることをprotected String doInBackground(String... params)意味します。paramsString

次に、 ...のdoInBackground(...)メソッドで次のようなことをしないでください。AsyncTask

 EditText uname = (EditText)findViewById(R.id.txt_username);
 String username = uname.getText().toString();

 EditText pword = (EditText)findViewById(R.id.txt_password);
 String password = pword.getText().toString();

...理由は、doInBackground(...)メソッドがメイン (UI) スレッドとは別のスレッドで実行され、EditTextウィジェットなどの UI 要素にアクセスしようとすると例外が発生するためです。代わりに、これらのコード行を のonClick(...)メソッドに移動しActivityます。次に、次を使用して資格情報をメソッドに渡すことができdoInBackground(...)ます (例)...

new Login().execute(new String[] {username, password});

...その後、doInBackground(String... params)メソッドでparams[0]は、ユーザー名params[1]になり、パスワードになります。

于 2013-03-17T22:05:49.770 に答える