我是一个android新手,我试图为我的应用程序找到一个好的结构,但我不知道如何做到这一点。
我只有一个活动和一个页面来收集信息并对其进行处理(将其推送到api、计算等)。但我只是不想把所有的东西都放在MainActivity.java中,因为它会变成一个长文件,有这么多函数。所以我希望能够从MainActivity.java调用这些函数,并在其他类中执行它们。
是否有具体的名称或方法?如果我为同一个主活动创建一个新的类来执行从那里调用的函数,并保持MainActivity.java简洁,我将扩展哪个类

最佳答案

你可以阅读一些关于mvc或mvp的知识。简言之,尝试将ui模块与逻辑模块分开。有一些常见的方法可供参考:
将公共api编写到***Util.java(使用静态函数),例如:FileUtil.java是一个处理文件管理的工具类,您可以编写
公共静态void savefile(字符串路径)
公共静态void deletefile(字符串路径)
公共静态void savejpeg(字符串路径,位图b)
公共静态void delallfiles(字符串文件夹)
等等。
您可以编写PreferenceUtil.java来处理android首选项管理。
如果许多活动具有相同的功能,则需要使用。例如:showWaitingDialog()。然后您可以编写一个BaseActivity.java,并在其中实现showWaitingDialog()
有时需要使用SinglePattern来实现代码。例如,您希望有一个User.java来管理所有用户事务,包括登录、注销、检查是否登录。确定何时使用SinglePattern,如果您的User.java必须在许多活动中使用,并且您的内存中必须只有一个实例。
下面是一个例子,LocationManager.java是由SinglePattern编写的。在我的应用程序中,许多活动都需要呼叫定位模块,而且必须是一个实例。

public class LocationManager implements AMapLocationListener {
    public interface OnLocationCallback{
        public void onLocateSuccess(double lng, double lat, String addr);
        public void onLocateFail(int code, String info);
    }
    private static volatile LocationManager mInstance = null;
    private Context context;
    public AMapLocationClient mLocationClient = null;
    private OnLocationCallback mCallback;

    private LocationManager(Context context){
        this.context = context;
        init(this.context);
    }

    public static LocationManager getInstance(Context context){
        if(mInstance == null){
            synchronized (LocationManager.class){
                if(mInstance == null){
                    mInstance = new LocationManager(context);
                }
            }
        }
        return mInstance;
    }

    private void init(Context context){
        mLocationClient = new AMapLocationClient(context);
        mLocationClient.setLocationListener(this);
        initLocationParams();

    }
    private void initLocationParams(){
        AMapLocationClientOption mLocationOption = null;
        mLocationOption = new AMapLocationClientOption();
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        mLocationOption.setNeedAddress(true);
        mLocationOption.setOnceLocation(true);
        mLocationOption.setWifiActiveScan(true);
        mLocationOption.setMockEnable(false);
        mLocationOption.setInterval(2000);
        mLocationClient.setLocationOption(mLocationOption);
    }

    public void startLocation(OnLocationCallback callback){
        this.mCallback = callback;
        mLocationClient.startLocation();
    }
    public void stopLocation(){
        this.mCallback = null;
        mLocationClient.stopLocation();
    }


    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {
                amapLocation.getLocationType();
                amapLocation.getLatitude();
                amapLocation.getLongitude();
                amapLocation.getAccuracy();
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date(amapLocation.getTime());
                df.format(date);
                amapLocation.getAddress();
                amapLocation.getCountry();
                amapLocation.getProvince();
                amapLocation.getCity();
                amapLocation.getDistrict();
                amapLocation.getRoad();
                amapLocation.getCityCode();
                amapLocation.getAdCode();

                if(mCallback != null){
                    mCallback.onLocateSuccess(amapLocation.getLongitude(), amapLocation.getLatitude(), amapLocation.getAddress());
                }
            } else {

                Log.e("AmapError", "location Error, ErrCode:"
                        + amapLocation.getErrorCode() + ", errInfo:"
                        + amapLocation.getErrorInfo());
                if(mCallback != null){
                    mCallback.onLocateFail(amapLocation.getErrorCode(), amapLocation.getErrorInfo());
                }
            }
        }
    }
}

呼叫:LocationManager.getInstance(getApplicationContext()).startLocation(new LocationManager.OnLocationCallback(){})
在某些情况下,您可以编写一个***Manager.java类来实现一些逻辑内容。正如您所提到的,然后您可以编写Calculations实现CalculationManager。下面是一些示例代码:
icalculateinterface.java:
public interface ICalculateInterface {
    int add(int a, int b);
    int sub(int a, int b);
}

计算器管理器.java
public class CalculateManager implements ICalculateInterface {
    @Override
    public int add(int a, int b) {
        return 0;
    }

    @Override
    public int sub(int a, int b) {
        return 0;
    }
}

关于java - Android结构:一项 Activity 有两个类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37908396/

10-10 10:18
查看更多