【问题标题】:Network utility design in Android appAndroid 应用程序中的网络实用程序设计
【发布时间】:2015-09-10 17:33:55
【问题描述】:

我正在创建一个 Android 应用原型,其功能如下:

当用户启动应用程序时,他们可以浏览文章标题列表。当他们单击其中一个时,应用程序会切换到另一个活动,其中包含文章内容等。用户也可以在文章标题列表中发布文章。

我正在尝试创建一个实用程序类,比如 ServerConnect.java,以处理所有 REST 请求和响应。一开始,该类有 3 个公共静态方法来发送用于不同目的的请求。

1.请求文章列表
2. requestArticleContent
3. userSendArticle(用户发表新文章)

然后我发现我不能只调用 ServerConnect.requestArticleList(),因为 Android 禁止 UI 线程上的网络行为。所以我将 ServerConnect 类更改为 extends AsyncTask 类。并把requestArticleList()放到doInBackground()中,然后做new ConnectServer().execute()之类的事情

好吧,当我启动应用程序并请求文章列表时,这给了我什么。但是,我的问题是,这个 ConnectServer 类只能做 requestArticleList 因为它是硬编码在 doInBackground @Override protected String doInBackground(Location userLocation) { return requestArticleList(userLocation); })

有什么方法可以在一个实用程序类中将所有这 3 种方法作为公共静态方法处理?
感谢大家对这么长的故事的耐心等待。

【问题讨论】:

    标签: java android networking system utility


    【解决方案1】:

    我不认为把它放在一个班级是一个好主意。如果您担心某些功能会在 3 个不同的类中重复,您可以将其放在一些基类中,如下所示。

    创建具有通用功能的抽象基类

    public abstract class ConnectionUtils<A,B,C> extends AsyncTask<A,B,C> {
        // put common functions here
    }
    

    然后为每个请求创建 3 个单独的类

    public class RequestArticleList extends ConnectionUtils<Location, Void, String> {
        @Override
        protected String doInBackground(Location... userLocation) {
            return requestArticleList(userLocation);
        }
    }
    

    如果你真的想要一个类中的所有这些功能,你可以创建回调接口

    public interface Callback<ResultType> {
        void onResult(ResultType result);
    }
    

    然后在每个函数中创建新线程

    public void requestArticleList(final Callback<MyResult> callback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // your code
                callback.onResult(result);
            }
        }).start();
    }
    

    缺点是它在 ui 更新之前需要 switching to main thread

    【讨论】:

    • 在我的系统中,requestArticleList 和 requestArticleContent 执行几乎相同的事情,除了前一个发送用户位置,后一个发送文章 ID。这就是我不想仅为 requestArticleContent 方法创建另一个类的原因。有什么建议吗?
    • 你不应该害怕为每个任务创建新的类。较小的类更容易阅读和维护。但是,如果您不相信,请使用上面的线程方法。
    【解决方案2】:
    import android.content.Context;
    
    import android.net.ConnectivityManager;
    
    import android.net.NetworkInfo;
    
    public class NetworkUtil {
    
        public static int TYPE_WIFI = 1;
        public static int TYPE_MOBILE = 2;
        public static int TYPE_NOT_CONNECTED = 0;
    
    
        public static int getConnectivityStatus(Context context) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
    
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (null != activeNetwork) {
                if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                    return TYPE_WIFI;
    
                if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                    return TYPE_MOBILE;
            } 
            return TYPE_NOT_CONNECTED;
        }
    
        public static String getConnectivityStatusString(Context context) {
            int conn = NetworkUtil.getConnectivityStatus(context);
            String status = null;
            if (conn == NetworkUtil.TYPE_WIFI) {
                status = "true";
            } else if (conn == NetworkUtil.TYPE_MOBILE) {
                status = "true";
            } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
                status = "false";
            }
            return status;
        }
    }
    

    【讨论】:

    • 如果您包含一些解释,将会对其他人非常有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多