我目前已经开发了一个带有一些 GUI 和网络操作的应用程序,但我需要让它更像一个没有 GUI 的库。
我知道在 Properties/Android 下有一个“is library”选项。但问题是:如何将 GUI 元素从项目中移出到不同的应用程序中,以便库/项目只有 java 代码;有什么建议吗?
谢谢。
最佳答案
如果您正在将代码制作成一个库,您希望尽可能地尝试将它与其他任何东西分离。这使得它更加便携,以便更多的人可以按照自己的意愿使用图书馆。即使您现在只是为自己使用这个库,以后您可能希望将它发布给其他人。
比如你目前的代码可能是这样的:
public void computeSum(int a, int b) {
int sum = a + b;
mTextView.setText(String.valueOf(sum));
}
现在这段代码与 mTextView
紧密结合。相反,像这样重写代码是有意义的:
//In library
public int computeSum(int a, int b) {
return a+b;
}
和
//Somewhere in your app
mTextView.setText(String.valueOf(computeSum(3,4)));
这是一个很小的变化,但是你可以看到 computeSum()
不再与 mTextView
耦合。这使得在整个项目甚至其他项目中使用它变得更加容易。现在 computeSum()
方法是 API 的一部分。
因此,对于您的网络调用,请尝试通过使用回调或返回值将它们与您的 GUI 内容分离。
关于您的最新评论:
您可以像这样创建一个包装器:
public class UIWrapper {
public Runnable runnable;
public SomeUiCallback callback;
}
然后在您的 AsyncTask 中使用它:
public class YourTask extends AsyncTask<UIWrapper, Void, Void> {
SomeUiCallback mCallback;
protected void doInBackground(UIWrapper... wrapper) {
mCallback = UiWrapper.callback;
UIWrapper.runnable.run();
}
protected void onProgressUpdate() {
}
protected void onPostExecute() {
mCallback.runYourUiStuff();
}
}
我快速编写了该代码,因此它可能无法编译,但希望您能理解。我认为这样的事情会起作用,不确定它是否是最优雅的解决方案。您可以将 Runnable 替换为您想要在线程中运行的任何内容。
因此 UIWrapper 和 YourTask 都将驻留在您的库中。您将创建 UIWrapper,然后在 YourTask 中使用它。
关于java - 带 UI 的 Android 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18965105/