您的位置:首页 > 理论基础 > 计算机网络

Android网络请求与JSON解析和数据抓取小实例

2014-10-13 17:16 597 查看
在Android开发中,我们或多或少都会需要用到请求,获取JSON和解析JSON,来获取有用的数据,这里我们可以写些小实例来帮助那些入门的初学者,少走学习的歪

路,节约更多时间往其他方向学习和发展



我就写一个登录接口的小应用,我只做了JSON抓取,而没做解析了,因为是测试用的



MainActivity :



package com.jdys;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONException;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
	// username edittext
	private EditText ed_user;
	// password edittext
	private EditText ed_pwd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Instantiated user
        ed_user = (EditText)findViewById(R.id.user);
        //Instantiated pwd
        ed_pwd = (EditText)findViewById(R.id.pwd);
    }
    // OK clickbotton
    public void Login(View v) throws Exception{
    	String time = (""+System.currentTimeMillis()).substring(0,10);
    	String user = ed_user.getText().toString();
    	String pwd = ed_pwd.getText().toString();
    	LoginAPI.LOGIN_REQUEST_URL = LoginAPI.LOGIN_REQUEST_URL.replace("TIMESTAMP", time);
    	LoginAPI.LOGIN_REQUEST_URL = LoginAPI.LOGIN_REQUEST_URL.replace("USERNAME", user);
    	LoginAPI.LOGIN_REQUEST_URL = LoginAPI.LOGIN_REQUEST_URL.replace("PASSWORD", pwd);
    	Log.d("XXXXXXXXXXXXXXXX", "时间戳:"+time+" "+"账户:"+user+" "+"密码:"+pwd+"\n"+LoginAPI.LOGIN_REQUEST_URL);
		// 发送请求获取数据
		new Thread(){
			@Override
			public void run() {
				super.run();
			try {
				String	jsonObject = LoginService.httpRequest(LoginAPI.LOGIN_REQUEST_URL);
				Log.d("XXXXXXXXXXXXXXXX", "返回的数据:"+jsonObject);
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
			}
		}.start();
    }
	public static boolean checkNetworkAvailable(Context context) {
		ConnectivityManager connectivity = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (connectivity == null) {
			System.out.println(" ######### 网络链接错误 ############### ");
			return false;
		} else {
			NetworkInfo[] info = connectivity.getAllNetworkInfo();
			if (info != null) {
				for (int i = 0; i < info.length; i++) {
					if (info[i].getState() == NetworkInfo.State.CONNECTED) {
						NetworkInfo netWorkInfo = info[i];
						if (netWorkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
							return true;
						} else if (netWorkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
							return true;
						}
					}
				}
			}
		}
		return false;
	}
}


LoginService :



package com.jdys;
import java.io.IOException;
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 org.apache.http.util.EntityUtils;
import org.json.JSONException;
import android.util.Log;
public class LoginService {
	public static String httpRequest(String requestURL) throws ClientProtocolException, IOException, JSONException{
		StringBuffer buffer = new StringBuffer();
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(requestURL);
		HttpResponse response = client.execute(get);
		if(response.getStatusLine().getStatusCode()==LoginAPI.HTTP_STATS){
			buffer.append(EntityUtils.toString(response.getEntity(),"UTF-8"));
		}else{
			Log.d("XXXXXXXXXXXXXXXX", "获取数据失败!");
		}
			return buffer.toString();
	}
}


运行结果:








需要注意的是,在 MainActivity 的 LoginService.httpRequest()方法需要放到新(子)线程里执行网络操作,因为在Android SDK 4.0及以上在主活动(此篇日志为MainActivity)里进行网络操作,需要在子线程里执行,否则会抛出 NetworkOnMainThreadException
异常


请大家引起注意~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: