0

HttpRequestGoogleプレイスにアクセスする前に、接続を確認する必要があります。

アクティブな接続がない場合は、ユーザーに「接続なし」と表示されます。それ以外の場合は、現在の場所を取得してリクエストを実行します。

いくつかのテストケース:

a)1.接続を有効にする->データを正常に取得する2.再度->データを正常に取得する

b)1.接続なし->「接続なし」、2。接続を有効にする->データを正常に取得

c)1.接続を有効にする->データを正常に取得する2.接続を無効にする->「接続なし」

これまでのところ良いですが、その後

d)1.アクティブな接続->データを正常に取得します。2。接続を無効にします->「接続なし」、3。接続を有効にします->「書き込みエラー:ssl = 0x5a90fbb0:システムコール中のI / Oエラー、パイプの破損」

HttpRequestテストケースd)の3番目のステップの前に、ロケーションデータが正しいことを確認するログステートメントがあります。だから私はそれが失敗している理由を見ることができません。

要求に応じたコード:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.results);

// set up location manager to work with location service
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

if (checkInternet()) {

    currentLocation = locationManager
                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    location = currentLocation.getLatitude() + ","
                    + currentLocation.getLongitude();

    places = new PlaceList();

    // keyword is passed in from previous activity
    Intent intent = this.getIntent();
        keyword = intent.getStringExtra("keyword");

        if (keyword != "") {

            class GoogleRequest extends AsyncTask<Void, Void, Integer> {

                protected Integer doInBackground(Void... params) {
                    mht = MyHttpTransport.createRequestFactory();
                    Resources res = getResources();
                    try {
                        HttpRequest request = mht
                                .buildGetRequest(new GenericUrl(
                                        res.getString(R.string.places_search_url)));
                        request.getUrl().put("key",
                                res.getString(R.string.google_places_key));
                        request.getUrl().put("location", location);
                        request.getUrl().put("radius", Config.RADIUS);
                        request.getUrl().put("keyword", keyword);
                        request.getUrl().put("sensor", false);

                        places = request.execute().parseAs(
                                PlaceList.class);

                                } catch (IOException e) {
                        Log.e(Config.MSGTAG, e.getMessage());
                    }

                    return null;
                }

                @Override
                protected void onPostExecute(Integer result) {
        // details omitted because it fails to 
        // get data from the places field
                }

            }

@Override
protected void onResume() {
    super.onResume();

    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 5000, 100, this);
}

@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    currentLocation = location;
}

public boolean checkInternet() {
    ConnectivityManager cm = (ConnectivityManager) this
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo mobile = cm
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if (wifi.isConnected()) {
        return true;
    } else if (mobile.isConnected()) {
        return true;
    }
    return false;
    }
}

ログ:

02-15 19:34:32.582: E/*(9967): Write error: ssl=0x5efd0a98: I/O error during system call, Broken pipe

ログの残りの部分はpostExecute()ですが、それは関係ありません。

4

1 に答える 1

0

私は問題を解決しました。

カスタムHttpTransportクラスには、メソッドが呼び出されるfinal ApacheHttpTransportたびに再利用されるオブジェクトがあります。createRequestFactory()問題は、接続が失われ、新しい接続が作成されると、古い接続(それらの線に沿ったもの)を使用しようとすることであるように思われます。したがって、これを回避するために、メソッド内に新しいApacheHttpTransportオブジェクトを作成します。createRequestFactory()

于 2013-02-16T01:02:06.707 に答える