处理不同线程和分离类中的互联网连接



我正在尝试使用 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。

这将提供清晰的关注点分离。

最新更新