0

我正在尝试在 android 中编写一个 Http API。我正在使用 AsyncTask 运行对我的 Web 服务的调用。我对更新 UI 不感兴趣,而我想要的只是在我的应用程序逻辑中使用的数据。这是我到目前为止所拥有的:

public class DataManager{
    public static String result;

    public DataManager ()
    {

    }


    public String get ()
    {
        User user = new User ();
        user.execute("http://someuri/service/users/id/21001");
        return user.getResult();
    }
}


public class User extends AsyncTask <String,Void,String>{

    private String result;
    @Override
    protected String doInBackground(String... arg0) 
    {
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet (arg0[0]);

        try
        {
            HttpResponse response = client.execute (get);
            if (response.getStatusLine().getStatusCode () == 200)
            {
                HttpEntity entity = response.getEntity();
                return EntityUtils.toString(entity);
            }

        } 
        catch (ClientProtocolException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        this.result = result;
    }

    public String getResult ()
    {
        return result;
    }

}

我想要一个典型的电话是: DataManager manager = new DataManager (); String value = manager.get ();

但是当我运行它时,我会返回 null。是什么导致了这种情况以及如何重构此代码以获得所需的行为。

4

1 回答 1

3

线程的整个想法是它同时运行。基本上,这就是你正在做的事情:

User user = new User (); // Create User object
user.execute("http://someuri/service/users/id/21001"); // Start thread
return user.getResult(); // Return thread result

但是,线程没有时间在“开始”和“返回结果”之间运行。

我建议使用某种回调;首先, make get()returnvoid并删除该return语句。然后,您传入一些实现的对象YourCallback,然后onCallback(result)从内部调用onPostExecute()

您的调用代码将如下所示:

DataManager x = new DataManager();
x.get(new YourCallback() {
    public void onCallback(String result) {
        // ...
    }
});

在这个奇妙的答案中有一个更完整的例子。

于 2012-10-29T03:58:50.377 回答