我正在尝试使用 AsyncTask 运行一个通过互联网访问 http 的后台线程。
当我想使用单独的辅助类来处理 http 时,就会出现问题。
我想把它放在一个单独的类上的原因是一个更干净的分隔代码,将 UI 功能与不同类中的 http 功能分开。所以我不想在UI类上有任何与http相关的内容,我只想调用这个单独的http辅助类来处理http。
所以我对如何与主线程通信(仅用于计时(感到困惑,因为 AsyncTask 方法 onPostExecute 实际上可以访问 UI,但我不希望 http 帮助程序类必须处理 UI。我是否应该在 http 帮助程序类中使用公共字段,然后在主线程中有一个循环来检查它的状态?
同样,我想将UI内容放在一个类中,而将http内容放在仅处理http内容的不同类中。
沟通和实现这一目标的最佳方式是什么?
提前感谢!
执行此操作的一般方法是通过回调。 您可以定义一个接口,其中包含事件发生时应调用的函数 - 例如 onHttpSuccess((。 您使 UI 类(可能是您的活动(实现该接口。 然后,将该接口的实例传递到构造函数中的 AsyncTask 中。 基本上,你会将doInBackground移动到另一个类,并在构造函数中完成onPreExecute和onPostExecute的所有实际工作。
您的AsyncTask看起来像(伪代码(:
class HttpTask extends AsyncTask{
public interface HttpCallback{
onHttpStart();
onHttpSuccess();
onHtpFail();
}
private HttpCallback mHttpCallback;
public HttpTask(Context, HttpCallback cb){
mHttpCallback = cb;
}
onPreExecute(){
mHttpCallback.onHttpStart();
}
doInBackground(){
//Do the HTTP transfer
}
onPostExecute(){
mHttpCallback.onHttpSuccess();
}
}
和您的活动类
class MyActivity extends Activity implements HttpCallback{
onHttpStart(){
//Perform any start UI work
}
onHttpSuccess(){
//Update the UI
}
}
使用接口/回调机制实现松耦合。 像这样:
注意 - 这是伪代码。 我还没有编译它。
1( 定义一个侦听器接口以接收来自 HTTP AsyncTask 的通知
public interface HttpListener {
public void onHttpRequestCompleteUiThread(.....)
}
2( 在 AsyncTask 的构造函数中需要此接口的实例。
public class HttpTask extends AsyncTask {
HttpListener listener;
public HttpTask(HttpListener listener) {
this.listener = listener;
}
...
}
3( 在 onPostExecute 中回调监听
器 protected void onPostExecute(...) {
listener. onHttpRequestCompleteUiThread(...
}
4( 在活动(或片段(中,实现侦听器接口。 在 onHttpRequestCompleteUiThread 中,您可以操作 UI。
这将提供清晰的关注点分离。