如果您正在将代码制作成库,您希望尽可能多地将其与其他任何东西分离。这使得它更加便携,以便更多人可以按照他们的意愿使用这个库。尽管您现在只是为自己使用这个库,但稍后您可能希望将其发布给其他人。
例如,您的代码目前可能是这样的:
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 中使用它。