我正在创建一个Android应用程序原型,其功能如下:
当用户启动应用程序时,他们可以浏览文章标题列表。当他们点击其中一个时,应用程序切换到另一个活动,其中包含文章内容等。用户还可以在文章标题列表中发布文章。
我正在尝试创建一个实用程序类,比如ServerConnect.java,来处理所有REST请求和响应。在开始时,该类有3个公共静态方法来发送不同用途的请求。
1. requestArticleList
2. requestArticleContent
3. userSendArticle(用户发表新文章)
然后我发现我不能只调用ServerConnect.requestArticleList(),因为Android禁止在UI线程上进行网络行为。所以我将ServerConnect类更改为extends AsyncTask
类。并将requestArticleList()放在doInBackground()中,然后执行new ConnectServer().execute()
之类的操作
嗯,这给了我什么,当我lauch应用程序和请求文章列表。但是,我的问题是,这个ConnectServer类只能执行requestArticleList,因为它在doInBackground中是硬编码的@Override
protected String doInBackground(Location userLocation) {
return requestArticleList(userLocation);
}
)
有没有什么方法可以在一个实用程序类中将所有这三种方法作为公共静态方法处理?
感谢所有人对这么长的故事的耐心。
我不认为把它放在一个班级是个好主意。如果你担心某个函数会在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);
}
然后在每个函数中创建新的Thread
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。
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;
}
}