Android MVC网络请求查询天气
数据接口来源于 聚合数据
了解过Javaweb的想必早就知道MVC是啥,在Android中其实都一样,差别不大
目录结构就是这样
V模型: 从最简单的view开始
v主要指的就是我们的xml布局文件,当热也不能说是全部,activity也是可以实现布局的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:text="查询天气"
android:id="@+id/bt_mvc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
</Button>
<EditText
android:layout_marginTop="10dp"
android:hint="输入城市/地区"
android:id="@+id/et_city"
android:layout_width="170dp"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
</EditText>
<TextView
android:layout_marginTop="20dp"
android:gravity="start"
android:id="@+id/tv_mvc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!" />
</LinearLayout>
activity
确实是对activity的臃肿解决了一点
public class MVCActivity extends AppCompatActivity {
private TextView textView;
private EditText editText;
private static final String TAG="MVCActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvc);
final MVCController controller = new MVCController(this);
initView(controller);
}
private void initView(final MVCController controller) {
textView = findViewById(R.id.tv_mvc);
editText = findViewById(R.id.et_city);
Button button = findViewById(R.id.bt_mvc);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String city = String.valueOf(editText.getText());
Log.d(TAG, "onClick: "+city);
if (TextUtils.isEmpty(city)){
city = Comment.DEFAULT_CITY;
}
controller.loadData(city);
}
});
}
public void updateUI(DataModel model){
textView.setText(model.getData());
}
}
M模型: model
网络请求使用的是okhttp,这是添依赖
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:3.6.0'
implementation 'com.squareup.okio:okio:1.11.0'
handle就是一个简单的异步更新ui,应该最为回调我觉得比较好一点,但是handle容易理解,简单
public class DataModel {
private static final String TAG="DataModel";
String data;
MVCActivity mvcActivity;
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
{
getWeather();
}break;
default:
break;
}
}
};
private void getWeather() {
mvcActivity.updateUI(this);
}
public DataModel(MVCActivity mvcActivity) {
this.mvcActivity = mvcActivity;
}
public String getData() {
return data;
}
public void loadModel(String city){
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url(Comment.BASH_URL+"?city="+city+"&key="+Comment.KEY)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()){
data = response.body().string();
Log.d(TAG, "onResponse: "+data);
Message message = new Message();
message.what=1;
handler.sendMessage(message);
}
}
});
}
}
C模型:Controller
public class MVCController {
MVCActivity mvcActivity;
DataModel dataModel;
public MVCController(MVCActivity mvcActivity) {
this.mvcActivity = mvcActivity;
}
public void loadData(String city){
dataModel = new DataModel(mvcActivity);
dataModel.loadModel(city);
}
}
就这样吧,希望后面mark一下使用回调写的model层