Android MVC网络请求查询天气

数据接口来源于 ​​聚合数据​

了解过Javaweb的想必早就知道MVC是啥,在Android中其实都一样,差别不大

Android MVC网络请求查询天气_mvc

目录结构就是这样

Android MVC网络请求查询天气_android_02

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层