0

シングルトンとして使用される単純な HttpManager を実装しており、異なるスレッドからの複数のリクエストを並行して実行できます。そのコードを見て、コンセプトが正しいかどうか教えてください。

public class HttpManager implements IHttpManager {

    private static final String TAG = HttpManager.class.getSimpleName();    
    private static final String HOST
    private static final int PORT = 80;

    private Handler mHandler; 
    private HttpClient mHttpClient;

    private static HttpManager sInstance = new HttpManager();

    public static HttpManager instance() {
        return sInstance;
    }

    private HttpManager() {
        mHandler = new Handler();
        mHttpClient = new DefaultHttpClient();
    }

    @Override
    public void execute(final IHttpRequest request) {   
        final String action = request.getAction();
        final List<NameValuePair> params = translateParams(request.getParams());

        (new Thread() {
            public void run() {
                try {                   
                    URI uri =URIUtils.createURI("http",HOST+"/"+action+".php", 
                        PORT, "", URLEncodedUtils.format(params, "UTF-8"), null);                   
                    final HttpGet httpget = new HttpGet(uri);

                    try {
                        HttpResponse response = mHttpClient.execute(httpget);
                        HttpEntity entity = response.getEntity();
                        if (entity != null) {
                            InputStream instream = entity.getContent();
                            final String text = readStream(instream);
                            Log.d(TAG, text);
                            mHandler.post(new Runnable() {
                                public void run() {
                                    request.onCompleted(text);
                                }
                            });
                        }
                    } catch (ClientProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (URISyntaxException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
4

2 に答える 2

0

これは機能しますが、スレッドはコストがかかるため、作成しないようにしてください。リクエストごとに作成する代わりに、ThreadPoolExecutorを使用します。execute メソッドで、Thread を作成する代わりに Runnable を作成し、それを Executor に渡します。

また、使用するスレッド プール サイズにも注意してください。スレッドが多すぎると、デバイスが動かなくなります。また、同時ネットワーク リクエストが多すぎると、特にモバイル ネットワークではパフォーマンスが低下する可能性があります。

于 2012-08-30T18:26:10.577 に答える
0

次のように変更します。

private static HttpManager sInstance = null;

public static HttpManager getInstance() {
    if( instance == null)
        sInstance = new HttpManager();

    return sInstance;
}

private HttpManager() {
    mHandler = new Handler();
    mHttpClient = new DefaultHttpClient();
}
于 2012-08-28T08:58:12.833 に答える