首先呢是设置权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
然后呢我们要导入包
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/httpclient-4.4.1.jar')
compile files('libs/httpcore-4.4.1.jar')
}
导完之后不要忘记加这个
packagingOptions {//导入http包的时候必须要加的以下这段话
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
}
好啦 让我们再一次愉快地敲起代码来
首先当然是加线程啦,像访问网络这种复杂的事情,哀家是不会自己做的,发配给我的子民去完成吧
private class thread implements Runnable{
@Override
public void run() {
String todayStart = "http://api.k780.com:88/?app=weather.today&weaid=";
String todayCity = local.getText().toString();
String todayEnd = "&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
String todayWeather = getURLConnection(todayStart + todayCity + todayEnd);
System.out.println("11111"+todayWeather);
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("todayWeather", todayWeather);
msg.setData(bundle);
//getBitmap(URL);
handler.sendMessage(msg);
}
}
然后线程中有一个方法是获取接口中的内容
private String getURLConnection(String path){
String xml = "";
try {
HttpClient client = new DefaultHttpClient();//创建一个http对象
HttpGet get = new HttpGet(path);
HttpResponse response = client.execute(get);
int code = response.getStatusLine().getStatusCode();//得到http响应结果的状态代码
Log.d("http", "code");
if(code==200){
//getEntity()是获取实体,getContent()是获取数据流
InputStream reader = response.getEntity().getContent();
BufferedReader bf = new BufferedReader(new InputStreamReader(reader));
String list = bf.readLine();//读一行
while(list!=null){
xml += list;
list = bf.readLine();
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("22222" + xml);
return xml;
}
做完之后呢 要使用handler处理一下
public class Myhandler extends Handler {
public void handleMessage(Message msg) {
String todayWeather = msg.getData().getString("todayWeather");
if(!todayWeather.equals("")){
try {
todayWeather = String.valueOf(new JSONObject(todayWeather).getJSONObject("result"));
JSONObject json = new JSONObject(todayWeather);
time.setText(json.getString("days"));
temp.setText(json.getString("temperature"));
weather.setText(json.getString("weather"));
wind.setText(json.getString("wind"));
URL = json.getString("weather_icon");
thread2 t2 = new thread2();
t2.start();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
在handler里面通过json解析,获取我们要的东西啦
如果宝宝们还想通过天气更改图标的话就要再加一个线程啦
private class thread2 extends Thread{
@Override
public void run() {
try{
URL myUrl = new URL(URL);
HttpURLConnection conn = (HttpURLConnection)myUrl.openConnection();
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("GET");
conn.connect();
Log.d("abc",String.valueOf(conn.getResponseCode()));
InputStream is = conn.getInputStream();
Log.d("is", String.valueOf(is));
bitmap = BitmapFactory.decodeStream(is);
Log.d("nine", "true");
is.close();
Message m = Message.obtain();
m.what=2;
phandler.sendMessage(m);
Log.d("is","true");
} catch (Exception e) {
e.printStackTrace();
}
Log.d("bitmap", "true");
}
}
然后处理,将获取的图片添加到ui中
public class Phandler extends Handler {
public void handleMessage(Message msg) {
if(msg.what==2){
pic.setImageBitmap(bitmap);
}
}
}
由于我一开始对线程不太理解,所以在这里浪费了很多时间,其实就是主线程呢自己不想做太复杂的事情,然后他就把事情交给苦逼的子线程去做,子线程做完了呢,主线程使用handler处理一下就ok了.