我目前正在开始开发 Android 应用程序,我必须说这一切都非常简单明了。
我有一个关于 AsyncTask 的小问题。也许我做错了什么,但情况就是这样。
我有一个需要从网络加载列表内容的小应用程序。我根据虚假请求开发了所有东西,结果都很棒。然后我用实际请求更新了代码并得到了“主线程错误网络”。所以我决定切换到 AsyncTask。
我想知道我是否可以让 AsyncTask 只做异步工作,并在其他地方处理结果(我实际上有 GUI 连接和所有东西)。我认为就可读性和逻辑而言,将所有处理接口的代码都放在 Activity 中更有意义,但我怎么能让 Activity 知道任务何时完成呢?
我编写了这些简单的类和接口(并且它有效),但我想知道这是一件好事还是有更好的方法可以做到这一点。
所以,这里是代码:
public interface AsyncDelegate {
public void executionFinished(LazyLoaderWithDelegate lazyLoaderWithDelegate);
}
这是一个简单的界面。目的是让 Activity 实现这一点并处理“executionFinished”方法。像听众一样的东西。
import android.os.AsyncTask;
public class LazyLoaderWithDelegate<Params, Progress, Result> extends AsyncTask<Params, Progress, Result>{
AsyncDelegate delegate;
Result result;
public LazyLoaderWithDelegate(AsyncDelegate delegate){
this.delegate = delegate;
}
@Override
protected Result doInBackground(Object... params) {
//This will be Overridden again from the subclasses anyway.
return null;
}
@Override
protected void onPostExecute(Result r){
this.result = r;
delegate.executionFinished(this);
}
public Result getResult(){
return result;
}
}
这个类基本上给出了一个骨架结构来在任务完成时通知委托。
就这样。这是使用此类的示例:
public class LazyVideoLoader extends LazyLoaderWithDelegate<Void, Void, List<List<Video>>>{
public LazyVideoLoader(AsyncDelegate delegate) {
super(delegate);
}
@Override
protected List<Video> doInBackground(Void ...params) {
return ServerInterface.getVideos();
}
}
public class MainActivity extends Activity implements AsyncDelegate {
private LazyVideoLoader videoLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* Set up the lazy loaders
*/
videoLoader = new LazyVideoLoader(this);
videoLoader.execute();
}
@Override
public void executionFinished(LazyLoaderWithDelegate task) {
if(task == videoLoader){
List<Video> result = videoLoader.getResult();
//Do whatever you need...
}
}