0

AndroidでHttpAPIを作成しようとしています。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

ただし、スレッドが「開始」と「結果を返す」の間で実行される時間はありません。

ある種のコールバックを使用することをお勧めします。まず、get()returnを実行し、ステートメントvoidを削除します。return次に、を実装するオブジェクトを渡し、内からYourCallback呼び出します。onCallback(result)onPostExecute()

呼び出しコードは次のようになります。

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

この素晴らしい答えには、はるかに充実した例があります。

于 2012-10-29T03:58:50.377 に答える