1

我正在通过 AsyncTask 内部类从我的 android 活动向 Web 服务发布帖子。我的想法是每次我发布到网络服务。我希望 AsynTask 向 Activity 返回一个字符串值,通知 Activity 是否有成功发布或发布到 Web 服务失败。我通过 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){
}
4

2 回答 2

1

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

于 2013-09-16T09:59:49.270 回答
0

永远不应该从 asynctask 的 doInBackgroundMethod() 调用 get()。在 AsyncTask 中,您会获得 3 个实用方法。

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

于 2013-09-16T10:19:07.757 回答