安卓中回調和使用控制器來處理的過程

要實現的效果是 java

下面是個人理解 
mController.sendAsyncMessage(LOGIN,userName,passWord);android

由於 mController 是 UserController,因此在 BaseController.java 中調取的  handleMessage(action, values);網絡

就是調取 UserController中  handleMessage 方法app

在 BaseActivity.java 中 ide

其實就是調取MainActivity.java 中 handlerMessage這個方法佈局

 

 

定義兩個基類this

BaseActivity.javaspa

package com.example.anroidtestdemo;.net

import android.app.Activity;
import android.os.Handler;
import android.os.Message;xml

public abstract class BaseActivity extends Activity implements IModeChangeListener {
    //更改UI的方法
    protected    Handler  mHandler  = new Handler(){
        @Override
        public void handleMessage(android.os.Message msg) {
            handlerMessage(msg);
        };
    };
    //初始化數據
    protected void initData() {
        // default Empty implementn
    }
    //發送請求的方法
    protected void handlerMessage(Message msg) {
        // default Empty implementn
    }
    //初始化界面
    protected void initController() {
        // default Empty implementn
    }
    //初始化UI
    protected abstract void initUI();
    //實現一個更新 返回處理不一樣UI的action
    @Override
    public void onModeChanged(int action, Object... values) {
        mHandler.obtainMessage(action, values[0]).sendToTarget();
        }
}

BaseController.java 基類(主要用來作初始化接口,獲取getContext,獲取提交過來的數據進行處理)

package com.example.anroidtestdemo;
import android.content.Context;
public abstract class BaseController {
    //初始化接口
    protected  IModeChangeListener mListener;
    protected Context mContext;
    public void setIModeChangeListener(IModeChangeListener listener) {
        mListener=listener;
    }
    public BaseController(Context c) {
        mContext=c;
    }
    /**
     * @param action  一個頁面可能有多個網絡請求,用來區別這些請求的
     * @param values 請求的數據
     */
    public void sendAsyncMessage(final int action,final Object... values){
        new Thread(){
            @Override
            public void run() {
                handleMessage(action, values);
            }
        }.start();
    }
    /**
     * 子類處理具體的需求的業務代碼
     */
    protected abstract void handleMessage(int action,Object... values);
  }

一個監聽接口

IModeChangeListener.java

package com.example.anroidtestdemo;

public interface IModeChangeListener {

    /**
     * onModeChanged 跟UI說界面須要修改 
     * @param action 返回處理不一樣UI的action
     */
    public void onModeChanged(int action,Object... values);
    
}

MainActivity.java 

package com.example.anroidtestdemo;

import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends BaseActivity {
    private UserController mController;
    public final static int  LOGIN=1;
    EditText userNameTv;
    EditText passWordTv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
        initController();
    }
    @Override
    public  void handlerMessage(Message msg){
        if(msg.what==LOGIN){
            //進行更改UI,作跳轉
            Log.i("620it","activity_login");
        }
    }
    @Override
    protected void initController() {
        mController = new UserController(this);
        //把當前的this 給UserController
        mController.setIModeChangeListener(this);
    }
    //提交
    public void submit(View view){
        String    userName = userNameTv.getText().toString();
        String passWord = passWordTv.getText().toString();
        //mController.sendAsyncMessage("login",userName,passWord);
        //把數據提交給UserController 來處理
        mController.sendAsyncMessage(LOGIN,userName,passWord);
    }
    //初始化UI
    @Override
    protected void initUI() {
        userNameTv = (EditText)findViewById(R.id.userName);
        passWordTv = (EditText)findViewById(R.id.passWord);
    }
}

一個處理用戶的信息的類UserController.java 

package com.example.anroidtestdemo;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

public class UserController  extends BaseController{

    public UserController(Context c) {
        super(c);
    }

    @Override
    protected void handleMessage(int action, Object... values) {
        
        String  userName = (String) values[0];
        String  passWord  = (String) values[1];
        //表示登陸
        if(action==MainActivity.LOGIN){
            //表示登陸成功
            if(!TextUtils.isEmpty(userName)&&!TextUtils.isEmpty(passWord)){
                Log.i("620it","登陸成功告訴Activity");
                
                //告訴Activity 
                mListener.onModeChanged(MainActivity.LOGIN,"sucess");
                
            }
        }
      }

}

佈局文件 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent">     <LinearLayout  android:layout_width="match_parent" android:layout_height="match_parent"          android:orientation="vertical">         <TextView android:text="用戶名" android:layout_width="wrap_content"           android:layout_height="wrap_content" />         <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/userName"/>         <TextView android:text="密碼" android:layout_width="wrap_content" android:layout_height="wrap_content"/>         <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:password="true"             android:id="@+id/passWord"/>         <Button android:text="提交" android:layout_width="wrap_content" android:layout_height="wrap_content"             android:onClick="submit"             />       </LinearLayout>    </RelativeLayout>  

相關文章
相關標籤/搜索