Android:onResume()在向Google Places发出HttpRequest时崩溃



在向Google Places发送HttpRequest之前,我需要检查连接。

如果没有活动连接,它将向用户显示"无连接",否则它将获得当前位置并执行请求。

一些测试用例:

a) 1。启用连接->获取数据精细,2。再次->获取数据精细

b) 1。无连接->"无连接",2。启用连接->获取数据精细

c) 1。启用连接->获取数据精细,2。禁用连接->"无连接"

到目前为止还不错,但

d) 1。活动连接->获取数据精细,2。禁用连接->"无连接",3。启用连接->"写入错误:ssl=0x5a90fbb0:系统调用期间的I/O错误,管道破裂"

在测试用例d)的第三步中,我有日志语句确认HttpRequest之前的位置数据是正确的。所以我看不出它失败的任何原因。

按要求编码:

@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(),但这无关紧要。

我已经解决了这个问题。

在我的自定义HttpTransport类中,我有一个final ApacheHttpTransport对象,每次调用createRequestFactory()方法时都会重用它。问题似乎是,当连接丢失,然后创建新的连接时,它会尝试使用旧的连接(沿着这些线)。因此,为了解决这个问题,我在createRequestFactory()方法中创建了一个新的ApacheHttpTransport对象。

相关内容

  • 没有找到相关文章

最新更新