我尝试使用AsyncTask来运行通过互联网访问http的后台线程。
当我想使用分离的帮助程序类来处理http时会出现问题。
我想将它放在一个单独的类上的原因是有一个更清晰的分区代码,将UI功能与不同类中的http功能分开。 所以我不希望在UI类上有任何与http相关的内容,我只想调用这个单独的http助手类来处理http。
所以我对如何与主线程进行通信(仅用于计时)感到困惑,因为AsyncTask方法onPostExecute实际上可以访问UI,但我不希望http助手类必须处理用户界面。 我应该在http帮助程序类中使用一个公共字段,然后在主线程中有一个循环来获取状态吗?
同样,我希望将UI内容放在一个类中,将http内容放在另一个只处理http内容的类中。
沟通和完成此任务的最佳方式是什么?
提前致谢!
答案 0 :(得分:1)
执行此操作的一般方法是通过回调。您可以定义一个接口,其中包含应在事件发生时调用的函数,例如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
}
}
答案 1 :(得分:0)
使用接口/回调机制来实现松散耦合。像这样:
注意 - 这是伪代码。我没有编译它。
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)在您的活动(或片段)中,实现Listener接口。在onHttpRequestCompleteUiThread中,您可以操作UI。
这将提供清晰的关注点分离。