4

全て、

ボタンクリックで送信されたユーザー入力に基づいてサーバーにhttprequestを作成する小さな機能アプリがあります。このhttprequestを非同期タスクにすることで、小さなアプリをSDK11+と互換性のあるものにするためのヘルプを探しています。

私は非同期タスクについて読んで数日を過ごし、原理と、httprequestをUIスレッドから遠ざける理由を理解しました。

しかし、私の場合、コードを機能させることができません。コンパイルすらできません。私は機能しているコードの下に(つまり、httprequestを非同期にしようとする前に)含めました

私はいくつかの特定の助けに非常に感謝します。ごみのコードについてお詫び申し上げます。この質問のバリエーションはすでに回答済みです。

よろしくお願いしますジェイミー

私のMainActivityコードは以下のとおりです。

package com.jrcdesign.ebookbeamer;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.Spinner;
import android.view.View.OnClickListener;


public class MainActivity extends Activity {

Button sendButton;
Button btnSubmit;
EditText msgTextField;
EditText msg2TextField;
Spinner spinner1;

/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // load the layout
    setContentView(R.layout.main);        

    // make message text field object
    msgTextField = (EditText) findViewById(R.id.msgTextField);
    msg2TextField = (EditText) findViewById(R.id.msg2TextField);

    // make send button object
    sendButton = (Button) findViewById(R.id.sendButton);
    btnSubmit = (Button) findViewById(R.id.btnSubmit);    
    addListenerOnButton();
    addListenerOnSpinnerItemSelection(); 

}            

    public void addListenerOnSpinnerItemSelection() {
    spinner1 = (Spinner) findViewById(R.id.spinner1);
    spinner1.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    }

    // get the selected dropdown list value
    public void addListenerOnButton() {

    spinner1 = (Spinner) findViewById(R.id.spinner1);
    btnSubmit = (Button) findViewById(R.id.btnSubmit);

    btnSubmit.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {

        Toast.makeText(MainActivity.this,
        "OnClickListener : " + 
                  "\nSpinner 1 : "+ String.valueOf(spinner1.getSelectedItem()),
            Toast.LENGTH_SHORT).show();

      msgTextField.setText("" + String.valueOf(spinner1.getSelectedItem()));

      }

    });
    }


    // Called when the SEND button is pressed
    // Need to make this an async task

    public void send(View v)
{
   // get the message from the message text box
    msgTextField.setText("" + String.valueOf(spinner1.getSelectedItem()));
    String msg = msgTextField.getText().toString();  
    String msg2 = msg2TextField.getText().toString();  

    if (msg.length()>0)
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://54.235.198.96/test1.php");
     try {
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
       nameValuePairs.add(new BasicNameValuePair("id", msg2));
       nameValuePairs.add(new BasicNameValuePair("message", msg));
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

       httpclient.execute(httppost);
       msgTextField.setText(""); // clear text box
       msg2TextField.setText(""); // clear text box

       Toast.makeText(MainActivity.this,
                "Your request is being processed",
                    Toast.LENGTH_LONG).show();

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

    }
    else
    {
        // display message if text fields are empty
        Toast.makeText(getBaseContext(),"All fields are required",Toast.LENGTH_SHORT).show();
    }

}

}
4

1 に答える 1

1

非同期クラスは次のとおりです。

private class AsyncTaskDownloadSomething extends
        AsyncTask<String[], String, String> {

    DataClassLentABook  mData;





    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Do some prepartations over here, before the task starts to execute
        //Like freeze the button and/or show a progress bar


    }





    @Override
    protected String doInBackground(String... urls) {
        // Task starts executing.
        String url = urls[0];

        // Execute HTTP requests here, with one url(urls[0]),
        // or many urls using the urls table
        // Save result in myresult

        return myresult;

    }





    protected void onPostExecute(String result) {
               //Do modifications you want after everything is finished
               //Like re-enable the button, and/or hide a progressbar
               //And of course do what you want with your result got from http-req



    }
}

非同期タスクを実行するには、ボタンがクリックされたときに次のように記述します。

new AsyncTaskDownloadSomething().execute(someURL);
于 2013-01-06T23:36:35.870 に答える