Android MVC网络请求查询天气

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层

发布了89 篇原创文章 · 获赞 13 · 访问量 7723

猜你喜欢

转载自blog.csdn.net/printf123scanf/article/details/103324776