如何在HttpURLConnection中添加AsyncTask?

时间:2012-08-03 06:19:40

标签: java android android-asynctask

我正在建立服务器连接,我的问题是我需要在我的代码上添加AsyncTask,因为它不能在sdk版本10中运行。我不想使用StrictMode.ThreadPolicy

public class TestConnection extends Activity {

@Override
public void onCreate(Bundle cbundle) {
    super.onCreate(cbundle);

    ConnectivityManager aConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo aNetworkInfo = aConnectivityManager.getActiveNetworkInfo();
    if (aNetworkInfo != null && aNetworkInfo.isConnected()){
        Toast.makeText(this, "Internet Connected", Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(this, "Internet Connection Timeout", Toast.LENGTH_LONG).show();
    }


    URL aURL;
    /* Will be filled and displayed later. */
    String aString = null;

    /* We will show the data we read in a TextView. */
    TextView aTextView = new TextView(this);
    try {

        /* Define the URL we want to load data from. */
        aURL = new URL(
                "http://url");

        /* Open a connection to that URL. */
        final HttpURLConnection aHttpURLConnection = (HttpURLConnection) aURL.openConnection();

        /* Define InputStreams to read from the URLConnection. */
        InputStream aInputStream = aHttpURLConnection.getInputStream();
        BufferedInputStream aBufferedInputStream = new BufferedInputStream(
                aInputStream);

        /* Read bytes to the Buffer until there is nothing more to read(-1) */
        ByteArrayBuffer aByteArrayBuffer = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = aBufferedInputStream.read()) != -1) {
            aByteArrayBuffer.append((byte) current);
        }


        /* Convert the Bytes read to a String. */
        aString = new String(aByteArrayBuffer.toByteArray());
    } catch (Exception aException) {

        /* On any Error we want to display it. */
        aString = aException.getMessage();
    }

    /* Show the String on the GUI. */
    aTextView.setText(aString);
    this.setContentView(aTextView);

}

}

3 个答案:

答案 0 :(得分:3)

private class ConnectionTask extends AsyncTask<String, Void, String>{
    @Override
    protected byte[] doInBackground(String... urls) {
            try {
    aURL = new URL(
            urls[0]);

    /* Open a connection to that URL. */
    final HttpURLConnection aHttpURLConnection = (HttpURLConnection) aURL.openConnection();

    /* Define InputStreams to read from the URLConnection. */
    InputStream aInputStream = aHttpURLConnection.getInputStream();
    BufferedInputStream aBufferedInputStream = new BufferedInputStream(
            aInputStream);

    /* Read bytes to the Buffer until there is nothing more to read(-1) */
    ByteArrayBuffer aByteArrayBuffer = new ByteArrayBuffer(50);
    int current = 0;
    while ((current = aBufferedInputStream.read()) != -1) {
        aByteArrayBuffer.append((byte) current);
    }


    /* Convert the Bytes read to a String. */
    aString = new String(aByteArrayBuffer.toByteArray());               } catch (IOException e) {
                Log.d(TAG, e.toString());
            }
        return aString;
    }

    @Override
    protected void onPostExecute(String result) {
               // result is what you got from your connection
aTextView.setText(result);

    }

}

如何称呼它:

                        ConnectionTask task = new ConnectionTask();
                        String[] params = new String[2];
                        params[0] = url;
                        params[1] = somethingelseifneeded;
                        task.execute(params);

答案 1 :(得分:1)

在oncreate()中你可以像这样使用::

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        StrictMode.ThreadPolicy policy = new       
                      StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
              new MyAsynTask().execute(null, null, null);
      }

然后在AsynTask中也这样做::

class MyAsynTask extends AsyncTask<Long, Integer, Integer> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected <Type> doInBackground(Long... params) {
            URL ur_url = newURL(http://....) 
                   // do the works on url.....
            return <tuped>result;
        }

        @Override
        protected void onPostExecute(Integer result) {
            // set the results in Ui

        }
    }

答案 2 :(得分:0)

参考下面的代码

new FetchRSSFeeds().execute();


private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);

    /** progress dialog to show user that the backup is processing. */
    /** application context. */

    protected void onPreExecute() {
        this.dialog.setMessage(getResources().getString(
                R.string.Loading_String));
        this.dialog.show();
    }

    protected Boolean doInBackground(final String... args) {
        try {

            /**
             * Write your URL connection code and fetch data here
             */

            return true;
        } catch (Exception e) {
            Log.e("tag", "error", e);
            return false;
        }
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

             /* Show the String on the GUI. */
                    aTextView.setText(aString);
                    this.setContentView(aTextView);

    }
}