如何将Http请求变成异步任务的示例

4

大家好,

我有一个小型的应用程序,根据用户输入通过按钮点击向服务器发出http请求。我希望得到一些帮助,使我的小应用程序与SDK 11+兼容,通过将此http请求作为异步任务来完成。

我花了几天时间阅读有关异步任务的内容,并理解了其原理以及将http请求从UI线程中分离的原因。

然而,在我的情况下,我只是无法让代码工作。我甚至无法编译它。以下是我的功能代码(即在尝试使http请求异步之前):

我非常感谢一些具体的帮助。对于我的垃圾代码以及这个问题的各种变化已经得到回答,我深表歉意。

提前致谢 Jamie

以下是我的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();
    }

}

}
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);

1
谢谢。我还没有让应用程序正常工作,但我认为你已经帮了我很多了。我需要抽出几个晚上来修改我的代码以实现你的建议。 - jamierc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接