当前位置:  编程技术>移动开发
本页文章导读:
    ▪异步http交付数据到服务器        异步http提交数据到服务器1.Android操作UI的方法不是线程安全的,开发者自己生成的线程对象是不能直接操作UI的,比如在新线程里修改某个TextView,生成某个Toast。 异步AsyncHttpClient封装了httpcli.........
    ▪ 百度map2.2框架黑屏和只有网格处理方法        百度地图2.2框架黑屏和只有网格处理方法   在最近的开发中,使用百度地图的时候发现在4.0以上的手机调用百度地图就崩掉的情况,具体错误已经忘记了,大致说的是分配给框架的内存不够.   .........
    ▪ 一个2013届毕业生(踏上IT行业)的迷茫(一)       一个2013届毕业生(踏上IT行业)的迷茫(1)从毕业到现在已经快半年了,已经想写这篇文字很久了,但是一次又一次的被没有时间给搁置了,今天突然好想写一篇自己这么多年的总结,算是.........

[1]异步http交付数据到服务器
    来源: 互联网  发布时间: 2014-02-18
异步http提交数据到服务器

1.Android操作UI的方法不是线程安全的,开发者自己生成的线程对象是不能直接操作UI的,比如在新线程里修改某个TextView,生成某个Toast。

异步AsyncHttpClient封装了httpclient,用起来比较方便

 

下面就例子来实践一下怎么用异步http框架 和 简单地仿写异步http框架

 

1.AndroidManifest.xml添加网络访问权限

 

<uses-permission android:name="android.permission.INTERNET"/>

 

2.在web项目中新建servlet,部署到服务器上

 

package cn.com.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

 

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//服务器接受统一编码iso-8859-1,然后获取字符串时转化为utf-8

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");

String password = request.getParameter("password");

System.out.println("name:"+name);

System.out.println("password:"+password);

if(name.equals("张三")&&password.equals("123")){

//往浏览器写字符串

response.getOutputStream().write("HttpClienget方式登录成功".getBytes("utf-8")); //写到浏览器的编码是utf-8

}

else{

response.getOutputStream().write("HttpClienget方式登录失败".getBytes("utf-8")); //写到浏览器的编码是utf-8

}

}

 

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//doGet(request, response);

//服务器接受统一编码iso-8859-1,然后获取字符串时转化为utf-8

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");

String password = request.getParameter("password");

System.out.println("name:"+name);

System.out.println("password:"+password);

if(name.equals("张三")&&password.equals("123")){

//往浏览器写字符串

response.getOutputStream().write("HttpClienpost方式登录成功".getBytes("utf-8")); //写到浏览器的编码是utf-8

}

else{

response.getOutputStream().write("HttpClientpost方式登录失败".getBytes("utf-8")); //写到浏览器的编码是utf-8

}

}

        

}

 

 

3.文件布局

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

    <EditText

        android:id="@+id/name"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:hint="输入用户名" 

        android:text="张三"

        />

    <EditText

        android:id="@+id/password"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:hint="输入密码" />

   

   

     <Button

        android:id="@+id/button"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="异步提交get方式提交"

        android:onClick="onClick1"

         />

    

     <Button

        android:id="@+id/button"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="异步提交post方式提交"

        android:onClick="onClick2"

         />

    

 

</LinearLayout>

 

 

4.要想使用异步http框架,首先要下载已经封装好的源代码

 

下载地址:https://github.com/search?p=2&q=android&ref=cmdform&type=Repositories



loopj/android-async-http

 

下载这个开源代码。下载解压后,里面有例子可参考。把src目录下地包复制项目src中,这样就可以使用里面的做好的异步http框架了。


 

MainActivity.java

 

package com.example.get;

 

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

 

import com.loopj.android.http.AsyncHttpClient;

import com.loopj.android.http.AsyncHttpResponseHandler;

 

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends Activity {

private EditText name,password;

private final int SUCCESS=1;

private Handler handler = new Handler(){

 

 

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

        name = (EditText) findViewById(R.id.name);

        password = (EditText) findViewById(R.id.password);

        

      

    }

 

   //get方法请求

   public void onClick1(View view){

   final String loginName = name.getText().toString();

   final String loginPasswor = password.getText().toString();

   

   //实例化异步http类

   AsyncHttpClient client = new AsyncHttpClient();

   

   String path = "http://10.162.0.171:8080/WebGet/LoginServlet?name="+URLEncoder.encode(loginName)+"&password="+URLEncoder.encode(loginPasswor);

       //调用get方法,调用做好的AsyncHttpResponseHandler消息处理器,更新ui

   client.get(path, new AsyncHttpResponseHandler(){

 

@Override

public void onSuccess(String content) {

Toast.makeText(MainActivity.this, content, 1).show();

}

 

@Override

public void onFailure(int statusCode, Throwable error, String content) {

// TODO Auto-generated method stub

super.onFailure(statusCode, error, content);

Toast.makeText(MainActivity.this,content, 1).show();

}

   

   } );

   

   }

//post方法请求

 public void onClick2(View view){

   final String loginName = name.getText().toString();

   final String loginPassword = password.getText().toString();

   

   

   AsyncHttpClient client = new AsyncHttpClient();

   

String postpath = "http://10.162.0.171:8080/WebGet/LoginServlet";

//设置参数

 RequestParams params = new RequestParams();

 params.put("name", loginName);

 params.put("password", loginPassword);

 client.post(postpath, params, new AsyncHttpResponseHandler(){

 

@Override

public void onSuccess(String content) {

// TODO Auto-generated method stub

super.onSuccess(content);

Toast.makeText(MainActivity.this, "发送请求:"+content, 1).show();

}

 

@Override

public void onFailure(Throwable error, String content) {

// TODO Auto-generated method stub

super.onFailure(error, content);

Toast.makeText(MainActivity.this, "发送请求:"+content, 1).show();

}

});

   }

    

}

 

 

Post方法请求设置参数是,点进去可见到有丰富的各种参数类型



简单的几步就完成了,乱码问题都已经帮我们解决了。

运行结果







 

到底异步http框架是如何封装httpclient的呢?下面我们通过一个简单的仿写http框架例子来理解它(这里仿写只是get方式提交)

 

 

 

 

1.这里是访问上面部署好的web,也用上面的布局文件。(这里就不在重复写了)

(1)

MainActivity.java

 

package com.example.asnychttp;

 

import java.net.URLEncoder;

 

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

 

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends Activity {

private EditText name,password;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

name = (EditText) findViewById(R.id.name);

password = (EditText) findViewById(R.id.password);

}

public void onClick(View view){

String loginName = name.getText().toString();

String loginPwd = password.getText().toString();

//1 开启子线程,执行一个http请求【在后台执行,在子线程执行】

//2.子线程执行完毕后,通知ui,更新页面

        //AsyncHttpClient类,我们自己写出来

AsyncHttpClient client = new AsyncHttpClient();

//输入地址

String path = "http://10.162.0.171:8080/WebGet/LoginServlet?name="+URLEncoder.encode(loginName)+"&password="+URLEncoder.encode(loginPwd);

 

         //我们自定义一个MyHandler消息处理器来更改ui

client.get(path, new MyHandler(){

 

@Override

public void onSuccess(String content) {

// TODO Auto-generated method stub

super.onSuccess(content);

Toast.makeText(MainActivity.this, "发出请求:"+content, 2).show();

}

 

@Override

public void onFailure(String content) {

// TODO Auto-generated method stub

super.onFailure(content);

Toast.makeText(MainActivity.this, "发出请求:"+content, 2).show();

}

});

}

 

}

 

 

(2)

AsyncHttpClient.java

 

 

package com.example.asnychttp;

 

import java.io.IOException;

import java.io.InputStream;

 

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

 

import android.os.Message;

 

/**

 *  异步http类

 * @author lenovo

 *

 */

public class AsyncHttpClient {

private final int SUCCESS=1;

private final int ERROR=2;

public void get(final String path,final MyHandler myHandler){

new Thread(){

public void run(){

//打开浏览器

HttpClient httpClient = new DefaultHttpClient();

//输入地址

HttpGet httpGet = new HttpGet(path);

//敲回车

try {

HttpResponse httpResponse=httpClient.execute(httpGet);

InputStream is=httpResponse.getEntity().getContent();

String content=StreamTools.readInputStream(is);

//执行成功,发送消息

Message msg = new Message();

msg.what=SUCCESS;

msg.obj=content;

myHandler.sendMessage(msg);

} catch (IOException e) {

// 执行失败,发送消息

Message msg = new Message();

msg.what=ERROR;

msg.obj="请求失败";

myHandler.sendMessage(msg);

e.printStackTrace();

}

}

}.start();

}

 

}

 

(3)消息处理器类

MyHandler.java

 

package com.example.asnychttp;

 

import android.os.Handler;

import android.os.Message;

 

/**

 * 自定义主线程消息处理器

 * @author lenovo

 *

 */

public class MyHandler extends Handler{

//成功执行的方法

public void onSuccess(String content){

}

//失败执行的方法

public void onFailure(String content){

}

 

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

String content = (String) msg.obj;

switch(msg.what){

case 1:

onSuccess(content);

break;

case 2:

onFailure(content);

break;

}

}

 

}

 

 

(4)读流工具类

 

StreamTools.java

package com.example.asnychttp;

 

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

 

public class StreamTools {

 

/**

 * 读取流

 * @param is

 * @return

 */

public static String readInputStream(InputStream is) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len =0;

try {

if((len=is.read(buffer))!=-1){

baos.write(buffer, 0, len);

}

byte[] b = baos.toByteArray();

return new String(b);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return null;

}

}

 

}

 

 

这就是一个简单的仿异步http框架




    
[2] 百度map2.2框架黑屏和只有网格处理方法
    来源: 互联网  发布时间: 2014-02-18
百度地图2.2框架黑屏和只有网格处理方法
   在最近的开发中,使用百度地图的时候发现在4.0以上的手机调用百度地图就崩掉的情况,具体错误已经忘记了,大致说的是分配给框架的内存不够.
        苦思冥想好久,再加上在网上搜寻解决方式,目标均指向一个地方,调用新的百度API  百度地图2.2
         
        说道立即就开始做,一开始还是挺顺利的,毕竟原本调用的就是百度地图,在研究了没多久便已经吧百度地图2.2移植到我自己的代码中.

        但是新的问题也随之出现,首先出现的问题是一进入百度地图整个框架都是黑色的,什么都没有.
        于是首先到的是我调用是否出问题了.再三查找,代码都能正常使用.然后直接去找到了百度地图2.2的DEMO调用后发现,使额用的代码一样但是我的框架却是黑色的

        之后整个页面抽丝剥茧的检查一遍,发现了 原来 百度地图2.2API的调用中不能使用 onkeydown  监听 因为在API的调用中,新的地图功能基本都是封装在MapView中,同时在运行 ondestory的时候也稍微多做了点别的动作之类的.
        总的来说简单的理解就是API自己也调用了OnkeyDown所以你不能用-_-

        解决了黑屏问题后满怀信心的开始继续开发,问题又出来了.整个页面只有中心点和网格  上网寻找各种解决方法,都不怎么有用,最后在总结了大量的解决方法后目标指向一个地方,调用的KEY不对

        再次打开LOG 发现每次使用百度地图API的时候都报了一个APPKEY没找到之类的错误,再三寻找发现原来百度地图2.2API使用的KEY是新的KEY,并且这个KEY不能再2.2以下的手机上使用
        这里附上网址,有这类问题的朋友可以去上面研究下
        新API官网: http://lbsyun.baidu.com/ ;        
      新Key的申请地址为:http://lbsyun.baidu.com/apiconsole/key 
        新API解析文档(内有申请KEY步骤): http://developer.baidu.com/map/sdkandev-1.htm#.E7.AE.80.E4.BB.8B3
        
        最后提醒下,申请的时候一个KeyStore对应一个Appkey,也就是说,测试有自己的Key,实际导出也有自己的Key.
        
        注:该签名KEY需要使用签名需要用到签名的SHA1值具体在百度上搜搜就有1楼frank9000昨天 11:58话说`我禁止发评论了么..怎么这么多个博文里面一个评论都没有..我打开姿势不对??

    
[3] 一个2013届毕业生(踏上IT行业)的迷茫(一)
    来源: 互联网  发布时间: 2014-02-18
一个2013届毕业生(踏上IT行业)的迷茫(1)

从毕业到现在已经快半年了,已经想写这篇文字很久了,但是一次又一次的被没有时间给搁置了,今天突然好想写一篇自己这么多年的总结,算是一种反思,也可以看作为未来的人生指路吧。

我和很多搞IT的同行们一样,不是什么富二代、也不是什么土豪,是从农村走出的男孩。很小的时候看到门前上小学的同村的娃,我就跟到他们后面哭着要去上学,就这样在我6岁那年成功进入了村里的学前班,在课堂上念着a,o,e,i,u,v.......就这样上完了整个小学。小学的那一段时光是我目前感到最快乐的时光,每天无忧无虑除了上课就是想着下午放学后玩什么,当时的我们不像现在的90后(除过我这个特殊的90后)00后,可以玩各种玩具,各种好玩的电子游戏。但是我们的童年很幸福很快乐,玩过现在孩子没有玩过的、打面包、弹球、打沙包、掏鸟窝等。人的一生中会遇到很多改变自己的人(贵人),分别在我小学、中学、大学都遇到了改变我(对我影响很大)的三个老师。

在我们那里小学的很多老师都是教过我父亲的,所以年龄都比较大,而且教学方式很老套,对新的课本没有什么研究,所以在我上小学的前5年没有真正去学过一门课,更谈不上兴趣。就在我上小学5年级的时候遇到了可以说是对我人生产生重大意义的老师,他当时是我们小学的主任、学校的学生都很怕他、听说他带过的班每个人都被他打过(包括女生)。他给我们带的是5年级的数学,在上第一节课后我真正见识到了这位老师的厉害,确实很严厉,好几个学生都被他x了,不知道是因为我的注意力比以前集中了,还是因为他确实教的好,从那天开始,我逐渐对数学产生了兴趣,那时候数学对我来说和玩耍同等重要,从解每一道数学应用题中获得了成就感,就这样在一次数学考试中考了100分,从此这位老师对我也特别好,我也很喜欢解应用题,越是难解,我越想把他解开。他给我们带了2年的数学,在这一段时间里我变化了不少,比以前也自信了很多。现在细细想起当时的那一段时光,很是怀念。。。。。。。就这样我读完了小学。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3