由于项目需要,在Launcher中需要定位当前的城市,使用的方法是利用新浪提供的网址来获得城市。
class CityThread extends Thread {
@Override
public void run() {
getCurrentProvinceAndCity();
}
}
private void getCurrentProvinceAndCity() {
Log.d("zhangmq", "getCurrentProvinceAndCity");
String provinceName = null;
String cnCityName = null;
final String url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?";
HttpGet httpGet = new HttpGet(url);
Log.d("zhangmq", "getCurrentProvinceAndCity 1111111111");
try {
Log.d("zhangmq", "getCurrentProvinceAndCity 2222222222");
HttpResponse httpResponse = new DefaultHttpClient()
.execute(httpGet);
Log.d("zhangmq", "getCurrentProvinceAndCity 33333333333333333333");
StatusLine statusLine = httpResponse.getStatusLine();
Log.d("zhangmq", "getCurrentProvinceAndCity 444444444444444444");
Log.d("zhangmq","statusLine = "+statusLine);
if (statusLine != null && statusLine.getStatusCode() == 200) {
cityResult = EntityUtils.toString(httpResponse.getEntity())
.trim();
Log.d("zhangmq","cityResult = "+cityResult);
cityHandler.sendEmptyMessage(GET_CITY_SUCCESS);
Log.d("zhangmq","sendEmptyMessage = GET_CITY_SUCCESS");
}
} catch (Exception e) {
e.printStackTrace();
cityHandler.sendEmptyMessage(GET_CITY_FAILURE);
}
}
private Handler cityHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.what == GET_CITY_SUCCESS) {
String[] results = cityResult.split("\t");
Log.d("zhangmq", "results.length = "+results.length);
if (results.length >= 5) {
provinceName = results[4];
cnCityName = results[5];
Log.d("zhangmq", "cityHandler provinceName = " + provinceName);
Log.d("zhangmq", "cityHandler cnCityName = " + cnCityName);
if (mStatusBarState.getCityState()) {
iv_city.setVisibility(View.VISIBLE);
tv_city.setVisibility(View.VISIBLE);
tv_city.setText(cnCityName);
}
}
saveProvineAndCnCityName(provinceName, cnCityName);
}
}
};
private void saveProvineAndCnCityName(String provinceName, String cityName) {
Context otherAppContext = null;
try {
otherAppContext = mContext.createPackageContext("com.android.msettings",
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SharedPreferences preferences = otherAppContext.getSharedPreferences(
"share_pre", Context.MODE_MULTI_PROCESS);
Editor editor = preferences.edit();
editor.putString("province_name", provinceName);
editor.putString("cn_city_name", cityName);
editor.commit();
}
在LauncherActivity中开启这个线程来获得当前城市:
new CityThread().start();
本来以为可以正确获得城市,但是结果是,根本就没有获取到。
看打印消息才知道在进行获取的时候出现了问题:
D/zhangmq ( 1979): getCurrentProvinceAndCity
D/zhangmq ( 1979): getCurrentProvinceAndCity 1111111111
D/zhangmq ( 1979): getCurrentProvinceAndCity 2222222222
W/ActivityThread( 1979): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
W/System.err( 1979): java.net.UnknownHostException: Unable to resolve host "int.dpool.sina.com.cn": No address associated with hostname
W/System.err( 1979): at java.net.InetAddress.lookupHostByName(InetAddress.java:428)
W/System.err( 1979): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err( 1979): at java.net.InetAddress.getAllByName(InetAddress.java:214)
W/System.err( 1979): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
W/System.err( 1979): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err( 1979): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err( 1979): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err( 1979): at com.android.mslauncher.LauncherActivityPanda.getCurrentProvinceAndCity(LauncherActivityPanda.java:647)
W/System.err( 1979): at com.android.mslauncher.LauncherActivityPanda.run(LauncherActivityPanda.java:731)
W/System.err( 1979): at java.lang.Thread.run(Thread.java:841)
W/System.err( 1979): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
W/System.err( 1979): at libcore.io.Posix.getaddrinfo(Native Method)
W/System.err( 1979): at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
W/System.err( 1979): at java.net.InetAddress.lookupHostByName(InetAddress.java:409)
W/System.err( 1979): ... 12 more
W/System.err( 1979): Caused by: libcore.io.ErrnoException: getaddrinfo failed: EINVAL (Invalid argument)
W/System.err( 1979): ... 15 more
D/zhangmq ( 1979): getCurrentProvinceAndCity 1111111111
D/zhangmq ( 1979): getCurrentProvinceAndCity 2222222222
W/ActivityThread( 1979): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
W/System.err( 1979): java.net.UnknownHostException: Unable to resolve host "int.dpool.sina.com.cn": No address associated with hostname
W/System.err( 1979): at java.net.InetAddress.lookupHostByName(InetAddress.java:428)
W/System.err( 1979): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err( 1979): at java.net.InetAddress.getAllByName(InetAddress.java:214)
W/System.err( 1979): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
W/System.err( 1979): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err( 1979): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err( 1979): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err( 1979): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err( 1979): at com.android.mslauncher.LauncherActivityPanda.getCurrentProvinceAndCity(LauncherActivityPanda.java:647)
W/System.err( 1979): at com.android.mslauncher.LauncherActivityPanda.run(LauncherActivityPanda.java:731)
W/System.err( 1979): at java.lang.Thread.run(Thread.java:841)
W/System.err( 1979): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
W/System.err( 1979): at libcore.io.Posix.getaddrinfo(Native Method)
W/System.err( 1979): at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
W/System.err( 1979): at java.net.InetAddress.lookupHostByName(InetAddress.java:409)
W/System.err( 1979): ... 12 more
W/System.err( 1979): Caused by: libcore.io.ErrnoException: getaddrinfo failed: EINVAL (Invalid argument)
W/System.err( 1979): ... 15 more
也在网上找了好多种解决的办法,但是一直没有解决。
最后也是机缘巧合下,我把获取城市的这段代码放在一个Manager类(非Activity,普通的java类)中,然后提供接口给LauncherActivity来获得当前城市或是进行显示设置,就一切都妥妥的了。
虽然解决了,但是还是不知道根本原因。。。。。。
这里只是记录下一种解决方法。
这里只是记录下一种解决方法。