在Activity中开启一个线程执行网络操作出现的问题

由于项目需要,在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

也在网上找了好多种解决的办法,但是一直没有解决。
最后也是机缘巧合下,我把获取城市的这段代码放在一个Manager类(非Activity,普通的java类)中,然后提供接口给LauncherActivity来获得当前城市或是进行显示设置,就一切都妥妥的了。
虽然解决了,但是还是不知道根本原因。。。。。。
这里只是记录下一种解决方法。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值