Android Http请求网络模拟超时
2014-01-08 16:32
357 查看
http://zhang247124629.iteye.com/blog/1490102
在Android平台上,Http请求网络有可以设置连接超时的API(conn.setConnectTimeout),在J2ME平台上就没有该API了。于是小阿哥今天小模拟一下。闲话不说了。上代码。
Java代码
package com.aisidi.age.handler;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
/**
*
* @author 小阿哥
* @date 2012-04-19
*
* */
public class Http {
private static Http http;
private HttpURLConnection conn;//连接。
private boolean isResponse;//是否有响应。。
private boolean isConnecting;//是否正在连接中。
private int connectTimeout;//连接超时时间。
private Http() {
}
public static Http getInstance() {
if (http == null) {
http = new Http();
}
return http;
}
/**
* 根据URL获得数据。字节数组。
* */
public byte[] getContentFromUrl(final String Url) {
if(this.connectTimeout!=0)
{
this.startTimer();
}
byte contentArray[] = null;
isResponse = false;
isConnecting = true;
try {
URL httpUrl = new URL(Url);
conn = (HttpURLConnection) httpUrl
.openConnection();
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
contentArray = getByteArrayFromStream(conn.getInputStream());
}
httpUrl=null;
} catch (Exception e) {
Debug.println("getContentFromUrl Ex:" + e.toString());
} finally {
if (conn != null) {
conn.disconnect();
}
}
if (contentArray != null) {
this.isResponse = true;
}
isConnecting = false;
return contentArray;
}
/**
* 根据URL获得相应图片。
* */
public Bitmap getBitmapFromUrl(String url)
{
Bitmap bit=null;
byte file[]=getContentFromUrl(url);
if(file!=null)
{
bit=BitmapFactory.decodeByteArray(file, 0,file.length);
}
return bit;
}
/**
* 设置连接超时。
* */
public void setConnectTimeout(final int connectTimeout)
{
this.connectTimeout=connectTimeout;
}
/**
* 启动计时器线程.
* */
private void startTimer()
{
Runnable runnable=new Runnable() {
boolean isRun=true;
long startTime=System.currentTimeMillis();
long enableTime;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("计时器线程 run start..isRun:"+isRun);
while(isRun)
{
enableTime=System.currentTimeMillis()-startTime;
if(isResponse||enableTime>=Http.this.connectTimeout)
{
System.out.println("计时器线程result str:"+(isResponse?("已经下载完毕了"):("时间延迟太长了强制关闭")));
isRun=false;
closeCurrentConnection();
break;
}
try{
Thread.sleep(50);
}catch (Exception e) {
System.out.println("计时器线程 sleep ex:"+e.toString());
}
}
System.out.println("计时器线程run..end time:"+enableTime);
}
};
new Thread(runnable).start();
}
/**
* 判断当前连接是否正在连接中。。。。
* */
public boolean isConnecting() {
return isConnecting;
}
/**
* 关闭当前连接。
* */
public void closeCurrentConnection() {
if (conn != null) {
conn.disconnect();
conn = null;
}
isResponse = false;
isConnecting = false;
}
private byte[] getByteArrayFromStream(InputStream inputStream) {
byte result[] = null;
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.flush();
result = outputStream.toByteArray();
outputStream.close();
outputStream = null;
inputStream.close();
} catch (Exception e) {
Debug.println("getStreamByteArray().EX:" + e.toString());
}
return result;
}
}
以上代码是模拟连接超时的主要逻辑代码。亲,上面的代码还有注释哟,专门为你写的。是不是很体贴啊。
Java代码
package com.aisidi.age.handler;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;
/**
*
* @author 小阿哥
* @date 2012-04-19
*
* */
public class MyView extends View implements Runnable{
private static final int CONNECTION_TIMEOUT = 800;
private static final String URL_DOWN_LOAD="http://ww3.sinaimg.cn/large/979d743fjw1ds3igt92dkj.jpg";
private static final String CONNECTING_TOAST="正在连网中。请稍候在试。。";
private Bitmap bitDownLoad;
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
new Thread(this).start();
this.setFocusable(true);
this.setFocusableInTouchMode(true);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
if(bitDownLoad!=null)
{
canvas.drawBitmap(bitDownLoad, 0,0,null);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)//当按返回键时,请求网络下载图片。
{
if(Http.getInstance().isConnecting())
{
Toast.makeText(this.getContext(), CONNECTING_TOAST, Toast.LENGTH_LONG).show();
}
else
{
requestBitmap(URL_DOWN_LOAD);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
//请求网络下载图片
public void requestBitmap(final String url)
{
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if(bitDownLoad!=null)
{
bitDownLoad=null;
}
long startTime=System.currentTimeMillis();
Http.getInstance().setConnectTimeout(CONNECTION_TIMEOUT);
bitDownLoad=Http.getInstance().getBitmapFromUrl(url);
System.out.println("请求图片线程run end time:"+(System.currentTimeMillis()-startTime)+"__"+((bitDownLoad!=null)?("有数据了"):("!!没有数据")));
}
}).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
this.postInvalidate();
try{
Thread.sleep(50);
}catch(Exception ex)
{
System.out.println("Thread.sleep.EX:"+ex.toString());
}
}
}
}
相关文章推荐
- 【常用开源库】Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- Android网络请求库——android-async-http
- 【Android网络开发】(一)HTTP请求报文和HTTP响应报文
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android Asynchronous Http Client-Android异步网络请求客户端接口
- Android中的HttpURLConnection网络请求方式
- Android HTTP网络请求的异步实现
- Android中HttpURLConnection网络请求
- Android Asynchronous Http Client-Android异步网络请求客户端接口
- Android HTTP网络请求的异步实现
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- Android 网络请求超时处理方案
- 网络数据请求实践一:android-async-http实现下载和上传
- Android网络请求的第三库AsyncHttpclient
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Java&Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同...
- Android_网络请求数据之HttpClient方式(核心代码)
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- Android更好的扩展性更强网络请求框架----okhttp