compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.9.0'
compile 'com.google.code.gson:gson:2.8.0'
在清单文件AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET"/>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/et_cityname"
android:hint="请输入城市名字"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_select_weather"
android:text="查询"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_werther_conten"
android:textSize="20sp"
android:text="测试"
android:layout_gravity="center"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
package com.example.myapplication2;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private final String KEY = "e1984444a03d4a52a1f6cc545cce9245";
private TextView tv_werther_conten;
private EditText et_cityname;
private Button btn_select_weather;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Werther werther= (Werther) msg.obj;
switch(msg.what){
case 1:
tv_werther_conten.setText("时间:" + String.valueOf(werther.getHeWeather6().get(0).getUpdate().getLoc()) +
"、地点:" + werther.getHeWeather6().get(0).getBasic().getLocation() +
"、天气:" + werther.getHeWeather6().get(0).getNow().getCond_txt() +
"、风向:" + werther.getHeWeather6().get(0).getNow().getWind_dir() +
"、气温:" + werther.getHeWeather6().get(0).getNow().getTmp());
break;
}
Log.d(TAG, "onResponse: " + String.valueOf(werther.getHeWeather6().get(0).getUpdate().getLoc()));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDate();
btn_select_weather.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String cityname = String.valueOf(et_cityname.getText());
if (cityname.equals("")) {
Toast.makeText(MainActivity.this, "城市名不能为空", Toast.LENGTH_SHORT).show();
} else {
String url = "https://free-api.heweather.com/s6/weather/now?key=e1984444a03d4a52a1f6cc545cce9245&location=" + cityname;
new MyAsyncTask().execute(url);
}
}
});
}
private void initDate() {
}
private void initView() {
tv_werther_conten = (TextView) this.findViewById(R.id.tv_werther_conten);
et_cityname = (EditText) this.findViewById(R.id.et_cityname);
btn_select_weather = (Button) this.findViewById(R.id.btn_select_weather);
}
private void getWerther(String url) {
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.get()//默认就是GET请求,可以不写
.build();
Log.d(TAG, "url: " + url);
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData = response.body().string();
Log.d(TAG, "onResponse: " + responseData);
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm").create();
Werther werther = gson.fromJson(responseData, Werther.class);
Message message=new Message();
message.what=1;
message.obj=werther;
handler.sendMessage(message);
}
});
}
class MyAsyncTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
String url = strings[0];
getWerther(url);
return null;
}
}
}
你可以复制上面的地址给个城市中文拼音都可以
拿到这个数据之后
Json自动创建module网站
进这个网站
在项目中创建这些类
用上自己的包名和第一个类名
在解析过程中如果内容不多可以不用这种方式,毕竟还是有点小麻烦的。
可以直接原生态,这里给大家一个例子如果不太明白,可以留言交流。
json解析:就是一层一层解析数据。
原生态解析只适合json数据量少。json数据量多还是推荐大家用Gson
List<User> uList= new ArrayList<>();
//将json格式的字符串[] 转换为java对象的List
private void jsonToJavaListByNative() {
//获取或者创建json数据
String json = "[\n" +
"\t{\n" +
"\t\t\"id\":1,\n" +
"\t\t\"name\":\"张三\",\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"id\":2,\n" +
"\t\t\"name\":\"李四\",\n" +
"\t}\n" +
"]";
//解析json数据
try {
JSONArray jsonArray = new JSONArray(json);
for(int i = 0;i < jsonArray.length();i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
if(null != jsonObject){
int id = jsonObject.getInt("id");
String name = jsonObject.optString("name");
User user = new User(id,name);
uList.add(user);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.d(TAG, "onResponse: " + uList.toString());
}
和风天气接口地址
大概意思和你说一下:
你在访问网络过程中是开了一个子线程,而你的主线程会继续运行下去,当你访问并获取数据的时候再更新UI,你的主线程已经跑完了。
1.在开发的过程中不能急,虽然说拿别人的代码会改就行,但是还是要自己理解和看懂。
2.没事像小白一样多写写,就记住了。不能每天都学习新知识。好像是拿了玉米丢了桃子,消化了在拿不是美滋滋。