从AsyncTask类中收集值会冻结我的UI

时间:2013-09-16 09:52:13

标签: android android-asynctask

我正在通过AsyncTask内部类从我的android活动发布一个Web服务。我的想法是,每次我发布到Web服务。我希望AsynTask将一个字符串值返回给Activity,通知活动是否有成功的帖子或发布到webservice的失败。 我是通过get方法完成的,但是我注意到当我点击按钮发布我的UI会在响应之前冻结一段时间。但这个职位仍然有效。请问有什么方法可以防止这个UI冻结。 我的代码如下。

这是我的AsyncTask类中的doBackground方法

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        String result = "";

        PatientModel patient = new PatientModel();
        patient.setPhone(Phone);
        patient.setEmail(Email);        
        patient.setGCMRegistrationID(GCMRegistrationID);

        JSONHttpClient jsonHttpClient = new JSONHttpClient();
        patient = (PatientModel) jsonHttpClient.PostObject(RestfulServiceUrl.RegisterPatient, patient, PatientModel.class);
        GCMRegistrar.setRegisteredOnServer(context, true);

        if(patient != null) {

            result = patient.getPhone();
        }
        else if(patient == null){
            result = "failed";
        }

        return result;
    }

这是我在活动中收集值的脚本

try {                       
    String result = new RegisterPatient(RegisterActivity.this,resource,email,phone,regId).execute().get();
}
catch(Exception e){
}

2 个答案:

答案 0 :(得分:1)

在实现get()时,不应该使用AsyncTask方法,因为它将异步调用转换为同步调用。通常,结果检索是使用自定义侦听器接口实现的,该接口由应接收响应的对象实现。

答案 1 :(得分:0)

永远不要从asynctask的doInBackgroundMethod()中调用

get()。在AsyncTask中你可以获得3种实用方法。

onPreExecute(),doInBackGround()和onPostexecute()。 onPreExecute()和onPostexecute()在UI线程上运行,doInBackGround()在单独的后台线程中运行。如果要将doInBackGround()方法中获得的值传递给活动,  将活动的引用传递给asynctask。从doInBackGround()返回值时,onPostexecute()方法捕获该值。您可以通过调用onpostExecute()方法中的活动中的任何方法将特定值传递给活动。另外我认为在这种情况下使用接口是最好的。