0

Web サービスを使用してすべてのデータを公開する Android アプリケーションを作成しています。DataManager というサービスからデータを取得するためのラッパー クラスを作成しています。

public class DataManager{

public DataManager (){}


public String getValue ()
{
    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet ("some url");

    try 
    {
        HttpResponse response = client.execute(get);
        if (response.getStatusLine ().getStatusCode() == 200)
        {
            HttpEntity entity = response.getEntity ();
            String result = EntityUtils.toString(entity);
            return result;
        }
    } 
    catch (ClientProtocolException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

}

このメソッドを呼び出すと、UI スレッドで RuntimeException が生成されます。このコードをリファクタリングして Web サービスから値をフェッチし、これらの値を非同期的に返すにはどうすればよいですか。[注] 一部のチーム メンバーのためにこれを書いているので、彼らはそれを使用してサービスからデータを取得できるので、彼らが簡単に使用できるようにしたいと考えています。

4

3 に答える 3

1

AsyncTaskまたはを使用しIntentServiceます。Android では、UI スレッドでネットワーク (および一般に時間のかかる操作) を実行することはできません。

ここでは、AsyncTask の基礎といくつかのチュートリアルを説明 します。ここでは、IntentService の基礎チュートリアルを説明します。

私は AsyncTask を自分で使用します (IntentService のジョブはキューに入れられます) が、新しい API での処理方法の変更に注意してください。ただし、大したことではありません (コード行が数行増えるだけです)。

于 2012-10-26T23:19:23.360 に答える
1

Android 用の David Chandler の基本的な HTTP クライアントライブラリを試してみることをお勧めします。

于 2012-10-26T23:21:34.137 に答える
1

これを行う最善の方法は、IntentService を使用することです。これにより、バックグラウンド スレッドと URL を渡す方法が提供されます。持っているデータの量に応じて、ローカル ファイルにダンプするか、データベースに保存することができます。

データベース ルートを実行する場合、AsyncTaskLoader を使用してアクティビティにデータを非同期的にロードするか、AsyncTask を使用してフル アクセスを実行できます。また、余分なオーバーヘッドはありますが、コーディングははるかに単純なので、データを ContentProvider に貼り付けてから、Activity で CursorLoader を使用できます。

とりわけ、UI スレッドでネットワーク操作やデータベース操作を行わないでください。アクティビティを「プレゼンター」(インテリジェントな「ビュー」) として使用し、すべてのコントローラーとモデルをバックグラウンドに置きます。

于 2012-10-26T23:23:38.847 に答える