1

Android用のアプリを作成するのは初めてで、asynctaskを初めて使用します。バックグラウンドで httppost を実行したいのですが、エラーが発生し続けます。正しいパラメーターを使用していますか? postexecute も必要ですか?

これが私のコードです

public void send(View v) { 新しい sendtask().execute(); }

   private class sendtask extends AsyncTask<String,Void, String> {


    String msg = msgTextField.getText().toString();  
    String msg1 = spinner1.getSelectedItem().toString();
    String msg2 = spinner2.getSelectedItem().toString();


    protected String doInBackground(String...url) {

          try {

               HttpClient httpclient = new DefaultHttpClient();
               HttpPost httppost = new HttpPost("http://10.0.2.2:80/test3.php");
               List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);;
               nameValuePairs.add(new BasicNameValuePair("id", "12345"));
               nameValuePairs.add(new BasicNameValuePair("name", msg));
               nameValuePairs.add(new BasicNameValuePair("gender",msg1));
               nameValuePairs.add(new BasicNameValuePair("age",msg2));
               httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));                   
               httpclient.execute(httppost);

               msgTextField.setText(""); // clear text box
             } catch (ClientProtocolException e) {
                 // TODO Auto-generated catch block
             } catch (IOException e) {
                 // TODO Auto-generated catch block
             }
        return null;
4

2 に答える 2

1

OnPostExecuteは、ユーザーインターフェイスを更新する必要がある場合に使用されます(メソッドdoInBackground(String。.. url)ではユーザーインターフェイスを更新できません)。OnPostExecuteによって受信されるパラメーターは、doInBackground(String。.. url)によって返される値です。 、あなたのケースがユーザーに関連しているかどうかではなく、投稿が行われたかどうかを通知します

于 2012-04-27T20:07:58.670 に答える
0

問題の特定と解決に役立つようにエラーも含める必要がありますが、この場合の解決策はおそらく次のとおりです。

private class sendtask extends AsyncTask<String, Void, String> {
    String msg = msgTextField.getText().toString();
    String msg1 = spinner1.getSelectedItem().toString();
    String msg2 = spinner2.getSelectedItem().toString();

    protected String doInBackground(String... url) {
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://10.0.2.2:80/test3.php");
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
            nameValuePairs.add(new BasicNameValuePair("id", "12345"));
            nameValuePairs.add(new BasicNameValuePair("name", msg));
            nameValuePairs.add(new BasicNameValuePair("gender", msg1));
            nameValuePairs.add(new BasicNameValuePair("age", msg2));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            httpclient.execute(httppost);

            return "";
        } catch (ClientProtocolException e) {
            return "ClientProtocolException";
        } catch (IOException e) {
            return "IOException";
        }
    }

    protected void onPostExecute(String result) {
        msgTextField.setText(result); // clear text box
    }
}

重要な変更点は、msgTextField.setText("");が にonPostExecute()あり、 から表示されるテキストを受け取ることdoInBackground()です。すべての UI 変更はメイン スレッドで行う必要があります。つまり、 ではありませんdoInBackground()

于 2012-04-27T20:43:35.893 に答える