android异步请求asyncTask使用—分析getResponseCode()阻塞

在实际应用中经常会遇到比较耗时任务的处理,比如网络连接,数据库操作等情况时,如果这些操作都是放在主线程(UI线程)中,则会造成UI的假死现象,Android中可以使用AsyncTask和Handler两种异步方式来解决这种问题。

AsyncTask(异步任务处理)

在使用AsyncTask时处理类需要继承AsyncTask,提供三个泛型参数,并且重载AsyncTask的四个方法(至少重载一个)。

An
asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called ParamsProgress and Result,
and 4 steps, called onPreExecutedoInBackgroundonProgressUpdate and onPostExecute.

三个泛型参数

1.Param 任务执行器需要的数据类型

2.Progress 后台计算中使用的进度单位数据类型

3.Result 后台计算返回结果的数据类型

在设置参数时通常是这样的:String... params,这表示方法可以有0个或多个此类型参数;有时参数可以设置为不使用,用Void...即可。

四个方法

1.onPreExecute() 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。

2.doInBackground(Params...) 后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress...)改变当前的进度值。

3.onProgressUpdate(Progress...) 运行于UI线程。如果在doInBackground(Params...) 中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。

4.onPostExecute(Result) 运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

执行代码:

new DownloadFilesTask().execute(url1, url2, url3);

将android的POST方法放入doInBackground(URL... url)

// Post方式请求
public static void requestByPost() throws Throwable {
	String path = "https://reg.163.com/logins.jsp";
	// 请求的参数转换为byte数组
	String params = "id=" + URLEncoder.encode("helloworld", "UTF-8")
			+ "&pwd=" + URLEncoder.encode("android", "UTF-8");
	byte[] postData = params.getBytes();
	// 新建一个URL对象
	URL url = new URL(path);
	// 打开一个HttpURLConnection连接
	HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
	// 设置连接超时时间
	urlConn.setConnectTimeout(5 * 1000);
	// Post请求必须设置允许输出
	urlConn.setDoOutput(true);
	// Post请求不能使用缓存
	urlConn.setUseCaches(false);
	// 设置为Post请求
	urlConn.setRequestMethod("POST");
	urlConn.setInstanceFollowRedirects(true);
	// 配置请求Content-Type
	urlConn.setRequestProperty("Content-Type",
			"application/x-www-form-urlencode");
	// 开始连接
	urlConn.connect();
	// 发送请求参数
	DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
	dos.write(postData);
	dos.flush();
	dos.close();
	// 判断请求是否成功
	if (urlConn.getResponseCode() == HTTP_200) {
		// 获取返回的数据
		byte[] data = readStream(urlConn.getInputStream());
		Log.i(TAG_POST, "Post请求方式成功,返回数据如下:");
		Log.i(TAG_POST, new String(data, "UTF-8"));
	} else {
		Log.i(TAG_POST, "Post方式请求失败");
	}
}

//***************************************************分割*************************************************************

在使用if(HTTP_200 == urlConn.getResponseCode())我在考虑getResponseCode()是不是一个阻塞方法(这里一定是,不然网络会一直失败),如果是阻塞那么会维持多久,多久后会给你网络代码编号?

这就很奇怪了,在URLConnection.java并没有表现出来是阻塞方法,但是其中httpURLConnect.java和URLConnection.java都是抽象类(abstract类)当我们调用抽象类的方法,经过查阅资料stackoverflow,发现具体的实现机制在底层sun.net.www.protocol.http.HttpURLConnection.。

这里我猜想java.net.HttpURLConnection和sun.net.www.protocol.http.HttpURLConnection存在继承关系,java.net.HttpURLConnection继承了java.net.URLConnection.java抽象方法,同时java.net.HttpURLConnection自己也是抽象类,一些实体实现对应到sun.net.www.protocol.http.HttpURLConnection中(这里sun.net.www.protocol.http.HttpURLConnection继承java.net.HttpURLConnection),在我们使用对应方法的时候就会调用实现实体(也可以说是重写后的方法)。

getResponseCode()的阻塞实现也就找到了,在getInputStream()中。

时间: 2024-10-13 10:58:05

android异步请求asyncTask使用—分析getResponseCode()阻塞的相关文章

android异步类AsyncTask的简单使用

Android为了降低这个开发难度,提供了AsyncTask.AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务,更通俗地说就是一个执行后台任务的线程 而且他还会自动通知主线程更新UI 优点: 结构清晰,容易理解. 缺点 代码量稍大 下面直接看代码 1 private class AsyncLogin extends AsyncTask<Void,Integer,Boolean>{ 2 private EditText passwordEdit; 3 private EditT

Android异步任务AsyncTask的使用与原理分析

在上一篇文章<Android缓存机制&一个缓存框架推荐>中说到,在了解了Android缓存机制后我准备自己动手写一个LruCache和DiskLruCache二级缓存的轻量级的图片请求框架,在思考如何搭建这个框架时,纠结于用何种方式去下载图片,是直接new出一个线程呢,还是用看起来稍微高大上档次一点的AsyncTask异步任务来处理?思来想去,还是虚荣心作怪,还是用AsyncTask吧,正好这个工具类我之前用的也比较少,对它的原理也不是很清楚,趁这个机会,好好学一下AsyncTask的

Android笔记二十六.Android异步任务处理(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Te

android 异步任务AsyncTask

package com.example.ansyctest; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl

Android异步之Asynctask与Handler面试七问

提出问题: 1.Android中的异步处理方式? 2.如何使用Handler以及在使用过程中如何避免Handler引起的内存泄露? 3.从源码角度分析MessageQueue,Message,handler,looper,主线程,子thread之间的关系 4.Handler通过sendMessage以及post Runable对象有什么区别 5.如何给一个线程建立消息循环,即如何构建一个looper线程? 6.Asynctask中有哪些方法,分别如何使用,哪些方法在主线程执行,哪些方法在子线程执

Android备注26.Android异步任务(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕画图事件等,对于其它的操作尽量不要在UI线程中实现,由于这些操作非常有可能会堵塞UI线程,比方一些耗时操作,会导致UI界面停止响应,从而减少了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完毕.但新线程也可能须要动态更新UI组件:比方须要从网上获取一个网页,然后在T

android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

为什么要用异步任务? 在android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作.如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常.所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask. AsyncTask可以在子线程中更新ui,封装简化了异步操作.适用于简单的异步处理.如果多个后台任务时就要使用Handler了

Android异步任务AsyncTask

1 package com.example.asynctask; 2 3 import java.net.MalformedURLException; 4 import java.net.URL; 5 6 import android.app.Activity; 7 import android.os.AsyncTask; 8 import android.os.Bundle; 9 import android.util.Log; 10 import android.view.Menu; 11

Android异步请求

1 class MyTask_SendMessage extends AsyncTask<String, Void, String> { 2 3 @Override 4 protected void onPostExecute(String result) { 5 super.onPostExecute(result); 6 ShowResponseFromTuling(result); 7 } 8 9 @Override 10 protected String doInBackground(