Android学习小结

近来由于公司赶项目,好久没写这种博客了,本来想在原有的csdn上写的,不知道为什么csdn跳转老是失败,所以就找了简书这个好平台来了。    

  http://blog.csdn.net/qq_29158381


先从http网络请求开始写起好了,以下是我工作中封装的http网络请求工具类,要用get请求就直接调用getDataByGet(String url)方法即可,要用post请求就直接调用getDataByPost(String url,String parms)  当然,里面的逻辑处理要你们自己写,我这里返回的都是String类型,用于公司接口的json解析,具体解析什么的到时填写在里面即可


/*http请求工具类*/

public class NetUtil {

private static NetUtil instance;

private NetUtil() {}

public synchronized static NetUtil getInstance() {

if (null == instance) {

instance = new NetUtil();

}

return instance;

}

//http-->get    获取字符串

public String getDataByGet(String url) {

try {

String jsonString=readStream(new URL(url).openStream());

JSONObject jsonObject=new JSONObject(jsonString);

String json=jsonObject.getString("data");

return json;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

//http-->post   获取字符串

public String getDataByPost(String url,String parms){

try {

String jsonString=readStream(sendPost(url, parms));

JSONObject jsonObject=new JSONObject(jsonString);

String json=jsonObject.getString("data");

return json;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

//得到post请求后的输入流

public InputStream sendPost(String url,String params){

URL mURL=null;

InputStream in=null;

HttpURLConnection conn=null;

try {

mURL=new URL(url);

conn=(HttpURLConnection) mURL.openConnection();

conn.setDoOutput(true);

conn.setRequestMethod("POST");

PrintWriter pw=new PrintWriter(conn.getOutputStream());

pw.print(params);

pw.flush();

pw.close();

in=conn.getInputStream();

} catch (Exception e) {

e.printStackTrace();

}

return in;

}

//将输入流中的文本提取出来

private String readStream(InputStream is){

InputStreamReader isr;

String result="";

try {

String line="";

isr=new InputStreamReader(is,"utf-8");

BufferedReader br=new BufferedReader(isr);

while((line=br.readLine())!=null){

result+=line;

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return result;

}

}


网络加载图片-----glide与picasso的使用


glide篇

Glide.with(context).load(url).error(R.drawable.error_img).into(img_view);

glide在适配器中若要进行复用,要设置标志,不然报错:

         v.setTag(R.string.app_name,holder);-> holder=(ViewHolder) v.getTag(R.string.app_name);


picasso篇

Picasso.with(context).load(url).error(R.drawable.error_img).into(img_view);

     picasso性能不如glide,但是如果glide使用过程中出现错误,一时解决不了的话就暂时先用Picasso代替一下吧


注意:这里的图片加载统统要在分线程中进行


判断是否接入网络



public boolean isNetworkConnected(Context context) {

if (context != null) {

ConnectivityManager mConnectivityManager = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();

if (mNetworkInfo != null) {

return mNetworkInfo.isAvailable();

}

}

return false;

}


发送短信倒计时60s实现


public class MyCountTimer extends CountDownTimer {

public static final int TIME_COUNT = 61000;//时间防止从59s开始显示

private TextView btn;

private String endStrRid;

private int normalColor, timingColor;//未计时的文字颜色,计时期间的文字颜色

/**

* 参数 millisInFuture        倒计时总时间

* 参数 countDownInterval    渐变时间(每次倒计1s)

* 参数 btn              点击的按钮(因为Button是TextView子类,为了通用我的参数设置为TextView)

* 参数 endStrRid  倒计时结束后,按钮对应显示的文字

*/

public MyCountTimer (long millisInFuture, long countDownInterval, TextView btn, String endStrRid) {

super(millisInFuture, countDownInterval);

this.btn = btn;

this.endStrRid = endStrRid;

}

/**

*参数上面有注释

*/

public  MyCountTimer (TextView btn, String endStrRid) {

super(TIME_COUNT, 1000);

this.btn = btn;

this.endStrRid = endStrRid;

}

public MyCountTimer (TextView btn) {

super(TIME_COUNT, 1000);

this.btn = btn;

this.endStrRid = "重新发送";

}

public MyCountTimer (TextView tv_varify, int normalColor, int timingColor) {

this(tv_varify);

this.normalColor = normalColor;

this.timingColor = timingColor;

}

// 计时完毕时触发

@Override

public void onFinish() {

if(normalColor > 0){

btn.setTextColor(normalColor);

}

btn.setText(endStrRid);

btn.setEnabled(true);

btn.setBackgroundResource(R.drawable.icon_getcode);

}

// 计时过程显示

@Override

public void onTick(long millisUntilFinished) {

if(timingColor > 0){

btn.setTextColor(timingColor);

}

btn.setEnabled(false);

btn.setText(millisUntilFinished / 1000 + "s");

}

}


txtview.setBackgroundResource(R.drawable.icon_getcode0);

MyCountTimer timeCount = new MyCountTimer(txtview);// 传入了文字颜色值

timeCount.start();


更新客户端工具类


public class UpdateManager {

private Context mContext;

//提示语

private String updateMsg = "有最新的软件包哦,快来下载吧~";

//返回的安装包url

private String apkUrl = "http://www.enuo120.com/Public/download/enuo.apk";

private Dialog noticeDialog;

private Dialog downloadDialog;

/* 下载包安装路径 */

private static final String savePath = "/sdcard/Download/";

private static final String saveFileName = savePath + "enuo.apk";

/* 进度条与通知ui刷新的handler和msg常量 */

private ProgressBar mProgress;

private static final int DOWN_UPDATE = 1;

private static final int DOWN_OVER = 2;

private int progress;

private Thread downLoadThread;

private boolean interceptFlag = false;

private Handler mHandler = new Handler(){

public void handleMessage(Message msg){

switch (msg.what) {

case DOWN_UPDATE:

mProgress.setProgress(progress);

break;

case DOWN_OVER:

installApk();

break;

default:

break;

}

};

};

public UpdateManager(Context context) {

this.mContext = context;

}

//外部接口让主Activity调用

public void checkUpdateInfo(){

showNoticeDialog();

}

private void showNoticeDialog(){

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle("软件版本更新");

builder.setMessage(updateMsg);

builder.setPositiveButton("下载更新", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

showDownloadDialog();

}

});

builder.setNegativeButton("以后再说", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

});

noticeDialog = builder.create();

noticeDialog.show();

}

private void showDownloadDialog(){

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle("软件版本更新");

final LayoutInflater inflater = LayoutInflater.from(mContext);

View v = inflater.inflate(R.layout.progress, null);

mProgress = (ProgressBar)v.findViewById(R.id.progress);

builder.setView(v);

builder.setNegativeButton("取消", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

interceptFlag = true;

}

});

downloadDialog = builder.create();

downloadDialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失

downloadDialog.show();

downloadApk();

}

private Runnable mdownApkRunnable = new Runnable() {

@Override

public void run() {

try {

URL url = new URL(apkUrl);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn.connect();

int length = conn.getContentLength();

InputStream is = conn.getInputStream();

File file = new File(savePath);

if(!file.exists()){

file.mkdir();

}

String apkFile = saveFileName;

File ApkFile = new File(apkFile);

FileOutputStream fos = new FileOutputStream(ApkFile);

int count = 0;

byte buf[] = new byte[1024];

do{

int numread = is.read(buf);

count += numread;

progress =(int)(((float)count / length) * 100);

//更新进度

mHandler.sendEmptyMessage(DOWN_UPDATE);

if(numread <= 0){

//下载完成通知安装

mHandler.sendEmptyMessage(DOWN_OVER);

break;

}

fos.write(buf,0,numread);

}while(!interceptFlag);//点击取消就停止下载.

fos.close();

is.close();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch(IOException e){

e.printStackTrace();

}

}

};

/**

* 下载apk

* @param url

*/

private void downloadApk(){

downLoadThread = new Thread(mdownApkRunnable);

downLoadThread.start();

}

/**

* 安装apk

* @param url

*/

private void installApk(){

File apkfile = new File(saveFileName);

if (!apkfile.exists()) {

return;

}

Intent i = new Intent(Intent.ACTION_VIEW);

i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");

mContext.startActivity(i);

}

/**

* 获取版本号

* @return 当前应用的版本号

*/

public String getVersion() {

try {

PackageManager manager = mContext.getPackageManager();

PackageInfo info = manager.getPackageInfo(mContext.getPackageName(), 0);

return info.versionName;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • #Android 基础知识点总结 ---------- ##1.adb - android debug bridg...
    Mythqian阅读 3,249评论 2 11
  • 2017年5月17日 Kylin_Wu 标注(★☆)为考纲明确给出考点(必考) 常见手机系统(★☆) And...
    Azur_wxj阅读 1,794评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 四季交替,昼夜更换,时间带来了什么。 转眼毕业一年了,曾经无话不谈的室友如今各奔东西。昨天阿德给我发微信说“最近有...
    寒窗之下阅读 177评论 0 1