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

07-28 03:45
查看更多