处理不同线程和分离类中的Internet连接

时间:2014-12-21 06:03:23

标签: java android multithreading

我尝试使用AsyncTask来运行通过互联网访问http的后​​台线程。

当我想使用分离的帮助程序类来处理http时会出现问题。

我想将它放在一个单独的类上的原因是有一个更清晰的分区代码,将UI功能与不同类中的http功能分开。 所以我不希望在UI类上有任何与http相关的内容,我只想调用这个单独的http助手类来处理http。

所以我对如何与主线程进行通信(仅用于计时)感到困惑,因为AsyncTask方法onPostExecute实际上可以访问UI,但我不希望http助手类必须处理用户界面。 我应该在http帮助程序类中使用一个公共字段,然后在主线程中有一个循环来获取状态吗?

同样,我希望将UI内容放在一个类中,将http内容放在另一个只处理http内容的类中。

沟通和完成此任务的最佳方式是什么?

提前致谢!

2 个答案:

答案 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。

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