Android 应用中的网络实用程序设计

Network utility design in Android app

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

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

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

1. 请求文章列表
2.请求文章内容
3. userSendArticle(用户post一篇新文章)

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

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

有什么方法可以在一个实用程序 class 中将所有这 3 个方法作为 public 静态方法处理?
感谢大家耐心看完这么长的故事。

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

创建具有常用功能的抽象基础class

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

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

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

如果您确实想要将所有这些功能合二为一class,您可以创建回调接口

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();
}

缺点是它的 require switching to main thread before ui update.

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;
    }
}