我正在尝试使用AsyncTask运行后台线程,该后台线程通过Internet访问http。
当我想使用单独的帮助器类来处理http时,就会出现问题。
我之所以将其放在单独的类上,是为了获得一个更清晰的分隔代码,以将UI功能与不同类中的http功能分开。
所以我不想在UI类上有任何与http相关的东西,我只想调用此分离的http helper类来处理http。
因此,我对如何与主线程通信(仅用于计时)感到困惑,因为AsyncTask方法onPostExecute实际上可以访问UI,但是我不希望http helper类必须处理UI。
我应该在http helper类中使用公共字段,然后在主线程中循环以检查其状态吗?
同样,我希望将UI内容放在一个类中,而将HTTP内容放在另一个仅处理http内容的类中。
交流和实现此目标的最佳方法是什么?
提前致谢!
最佳答案
一般的方法是通过回调。您定义一个接口,该接口具有在事件发生时应调用的函数,例如onHttpSuccess()。您使UI类(可能是Activity)实现了该接口。然后,您将该接口的实例传递到构造函数中的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
}
}