Android入门教程 HttpURLConnection的用法 HTTP请求
来源:互联网 发布:冰川网络手游怎么样 编辑:程序博客网 时间:2024/04/29 20:21
写在前面:
android使用网络一定记得加上网络访问权限
<uses-permission android:name="android.permission.INTERNET" />
一、使用HttpURLConnection发送网络请求
1、get方式发送请求
step1:创建URL对象
step2:通过URL对象调用openConnection()方法获得HttpURLConnection对象
step3:HttpURLConnection对象设置其他连接属性
step4:HttpURLConnection对象调用getInputStream()方法向服务器发送http请求 并获取到服务器返回的输入流
step5:读取输入流,转换成String字符串
注意:
网络请求,通常耗时较长,所以不能在主线程中进行,需要单独开一个子线程进行网络请求
代码示例
public class MainActivity extends Activity { private TextView webTextView; private String webText; private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==1){ webTextView.setText(webText); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webTextView = (TextView) findViewById(R.id.web_text); //创建线程对象 MyThread mThread = new MyThread(); //启动线程 new Thread(mThread).start(); } /** * 定义一个子线程,在子线程中访问网络 * @author jiangjunjie * */ private class MyThread implements Runnable{ @Override public void run() { try { URL url = new URL("http://www.baidu.com"); HttpURLConnection mConnection = (HttpURLConnection) url.openConnection(); mConnection.setConnectTimeout(10000);//设置连接超时 //创建输入流 InputStream in = null; //判断连接返回码 if(mConnection.getResponseCode()==200){ //返回码是200时,表明连接成功 in = mConnection.getInputStream(); } //创建输入流读取对象 InputStreamReader inReader = new InputStreamReader(in, "UTF-8"); //输入流缓存读取 BufferedReader bufferedReader = new BufferedReader(inReader); StringBuffer sb = new StringBuffer(); String temp = null; //输入流转换成String while((temp=bufferedReader.readLine())!=null){ sb.append(temp); } webText = sb.toString(); } catch (IOException e) { e.printStackTrace(); } //Handler创建消息对象 Message msg = mHandler.obtainMessage(); msg.what = 1; //发送Handler消息 mHandler.sendMessage(msg); } }}
2、post方式发送请求
post请求方式和get方式步骤类似,只需添加一句
mConnection.setRequestMethod("POST");
二、使用HttpURLConnection加载网络图片
加载网络图片,需要用到Bitmap对象。
加载网络图片有时也需耗时较长时间,所以也应该异步加载。
在此,以AsyncTask为例。
效果图
ShowWebPicActivity代码示例
public class ShowWebPicActivity extends Activity { Button showBtn; ImageView webimgView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_web_pic); bindID(); showBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { DownloadImgTask task = new DownloadImgTask(ShowWebPicActivity.this, showBtn, webimgView); task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg"); } }); } private void bindID() { showBtn = (Button) findViewById(R.id.show_btn); webimgView = (ImageView) findViewById(R.id.pic_img); }}
DownloadImgTask代码
public class DownloadImgTask extends AsyncTask<String, Integer, Integer>{ private Context context; private Button btn; private ImageView imageView; //加载网络图片需要用到Bitmap对象 private Bitmap bitmap; public DownloadImgTask(Context context,Button btn,ImageView imgview) { this.context = context; this.btn = btn; this.imageView = imgview; } @Override protected Integer doInBackground(String... params) { try { //创建URL对象 URL url = new URL(params[0]); //通过URL对象得到HttpURLConnection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //得到输入流 InputStream inputStream = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(inputStream); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return 1; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); switch (result) { case 1: imageView.setImageBitmap(bitmap); break; default: break; } }}
三、使用HttpURLConnection下载网络资源
下载网络资源用到的知识点,除了网络资源访问,还需要用到文件操作的知识,比如判断文件是否存在、创建目录、创建文件等等。
activity_download.xml布局文件代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/progressbar" style="?android:attr/progressBarStyleHorizontal" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="下载" android:id="@+id/downloadBtn" android:layout_below="@id/progressbar" /></RelativeLayout>
DownloadActivity代码
public class DownloadActivity extends Activity { ProgressBar progressBar; Button downloadBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); bindID(); downloadBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { downloadBtn.setEnabled(false); //构造方法初始化 DownLoadTask dTask = new DownLoadTask(DownloadActivity.this,downloadBtn,progressBar); //执行任务 dTask.execute("http://img1.bitautoimg.com/bitauto/2012/09/17/a50cdcf8-1a2a-418b-b7be-d81f36ab12ee.jpg","fra.jpg"); } }); } private void bindID() { progressBar = (ProgressBar) findViewById(R.id.progressbar); downloadBtn = (Button) findViewById(R.id.downloadBtn); }}
DownLoadTask代码
public class DownLoadTask extends AsyncTask<String, Integer, Integer> { private Context context; private Button btn; private ProgressBar pBar; private String SDPATH = ""; private String PATH=""; /** * 构造方法 * @param context Activity上下文环境 * @param btn 下载按钮 * @param pBar 进度条 */ public DownLoadTask(Context context,Button btn,ProgressBar pBar) { this.context = context; this.btn = btn; this.pBar = pBar; this.SDPATH = Environment.getExternalStorageDirectory() + "/"; this.PATH = this.SDPATH+"download_pic/"; System.out.println("PATH***:"+PATH); } @Override protected Integer doInBackground(String... params) { //定义输入流和输出流对象 InputStream inputStream = null; OutputStream outputStream = null; //定义文件对象 File file = null; //判断文件是否存在 if (isFileExists(PATH+params[1])) { //如果存在,直接返回,执行onPostExecute方法 return 1; } try { //创建URL对象 URL url = new URL(params[0]); //通过URL对象创建HTTP连接 HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(); //判断返回码 if (httpUrlConnection.getResponseCode() == 200) { inputStream = httpUrlConnection.getInputStream(); // 更新进度条(设置进度条总长度) publishProgress(-2, httpUrlConnection.getContentLength()); } else { // 下载有误,网络连接错误 publishProgress(-1); } //创建目录 createDir(PATH); //创建文件 file = createFile(PATH+params[1]); //创建输出流 outputStream = new FileOutputStream(file); //创建缓冲区 byte buffer[] = new byte[4*1024]; int length = 0; int sum = 0; while((length = inputStream.read(buffer))!=-1){ outputStream.write(buffer,0,length); //已经下载的长度 sum+=length; //更新进度条 publishProgress(0,sum); } outputStream.flush();//强制把缓冲区的数据写入到文件并清空缓冲区 } catch (IOException e) { e.printStackTrace(); } return 0; } /** * 下载过程中执行此方法 * @param values */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); switch (values[0]) { case 0: pBar.setProgress(values[1]); break; case -1: Toast.makeText(context, "网络连接错误,请检查下载链接是否正确", Toast.LENGTH_LONG).show(); break; case -2: pBar.setMax(values[1]); break; default: break; } } /** * 下载完成后执行此方法 * @param result */ @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); btn.setEnabled(true); switch (result) { case 1: Toast.makeText(context, "文件已存在", Toast.LENGTH_LONG).show(); break; default: break; } } /** * 工具方法——判断文件已存在 * * @return */ private boolean isFileExists(String fileName) { File file = new File(fileName); if (file.exists()) { // 文件已存在 return true; } return false; } /** * 工具方法——创建目录 */ private boolean createDir(String dirName) { File file = new File(dirName); boolean isCreateDir = file.mkdir(); return isCreateDir; } /** * 工具方法——创建文件 * @param string */ private File createFile(String fileName) { File file = new File(fileName); boolean isCreateFile = false; try { isCreateFile = file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return file; }}
1 0
- Android入门教程 HttpURLConnection的用法 HTTP请求
- Android HTTP请求方式:HttpURLConnection
- Android基础入门教程——7.1.3 Android HTTP请求方式-HttpURLConnection
- HttpURLConnection简单用法-java模拟HTTP请求
- HttpURLConnection简单用法-java模拟HTTP请求
- Android的中http协议HttpURLConnection中post请求
- Android HttpURLConnection的用法
- Android中HttpURLConnection实现HTTP请求
- Android上使用HttpURLConnection发送HTTP请求
- Android使用HttpURLConnection发送HTTP请求
- 封装的Http请求(HttpURLConnection和okHttp)
- httpurlconnection类的get请求的用法
- httpURLConnection发送http请求
- http请求之HttpURLConnection
- HttpURLConnection发送网络请求的用法
- HttpUrlConnection和HttpClient和android-async-http框架的GET和POST请求
- Android中使用HttpURLConnection和HttpClient发送Http请求
- Android Http接地气网络请求(HttpURLConnection)
- 技术要能够变现才有价值
- codeforces 721D Maxim and Array(贪心)
- 将一台XP添加到WindowsServer2008的域中时不能联系域的域控制器的原因
- yii框架的简单curd
- Java锁的种类以及辨析
- Android入门教程 HttpURLConnection的用法 HTTP请求
- 多路查找树(B树)
- 详解wait和waitpid函数
- C++中的new和malloc
- 使用对拍
- seesion和cookie
- Evaluate Postfix Expression
- 跪在进化成码农的路上
- 数据结构实验之栈六:下一较大值(二)