Code Bye

调用NsdService相关api导致手机重启(随机)

哪位高手能帮本人看一下,监听类就是当前activity,sdk版本是分别是16和17.小弟刚开始学安卓,很多都不太懂,希望高手帮忙解答一下。
public class MainActivity extends FragmentActivity implements
		OnPageChangeListener, OnCheckedChangeListener,
		NsdManager.DiscoveryListener,NsdManager.ResolveListener,
		NsdManager.RegistrationListener
{
	private ViewPager pager;
	private MainPageAdapter adapter;
	public List<Fragment> fragments;
	private RadioGroup group;
	private RadioButton button0, button1, button2,button3;
	private NsdManager mNsdManager;
	private NsdManager.ResolveListener mResolveListener;
	private String TAG = "NSD_LOG ";
	private boolean isDescovering = false;
	public  boolean backtoroot = false;
	public HashMap<String,Fragment> fragmentsMap = new HashMap<String,Fragment>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		fragments = new ArrayList<Fragment>();
		fragments.add(new Fragment_A());
		fragments.add(new ColorSelectOneActivity());
		fragments.add(new Fragment_C());
		fragments.add(new Fragment_D());
		pager = (ViewPager) findViewById(R.id.pager);
		adapter = new MainPageAdapter(getSupportFragmentManager(), fragments);
		pager.setAdapter(adapter);
		pager.setOffscreenPageLimit(fragments.size() - 1);
		pager.setOnPageChangeListener(this);
		group = (RadioGroup) findViewById(R.id.radioGroup1);
		button0 = (RadioButton) findViewById(R.id.radio0);
		button1 = (RadioButton) findViewById(R.id.radio1);
		button2 = (RadioButton) findViewById(R.id.radio2);
		button3 = (RadioButton) findViewById(R.id.radio3);
		group.setOnCheckedChangeListener(this);
		WifiSwitcher wifiSwitcher = new WifiSwitcher();
		fragmentsMap.put("wifi_switcher",wifiSwitcher);
		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
		StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
		//自动连接,先判断能否是AP,假如不是则连接mdns
		AppDelegate delegate = (AppDelegate)getApplication();
		try {
			Socket socket = new Socket("192.168.1.1", 5001);
			delegate.put("host","192.168.1.1");
			delegate.put("port", 5001);
		} catch (Exception e) {
			e.printStackTrace();
//			开始自动发现网络服务
//			获取nsdmanager
			try {
				mNsdManager = (NsdManager)getSystemService(NSD_SERVICE);
//
//				NsdServiceInfo serviceInfo  = new NsdServiceInfo();
//				serviceInfo.setServiceName("WokeSmart");
//				serviceInfo.setServiceType("_socket._tcp");
//						serviceInfo.setPort(5001);
//
//
//				serviceInfo.setHost(InetAddress.getLocalHost());
				//开始发现
//				mNsdManager.discoverServices("_ipp._tcp.", mNsdManager.PROTOCOL_DNS_SD, this);
//				mNsdManager.discoverServices("_http._tcp", mNsdManager.PROTOCOL_DNS_SD, this);
//				mNsdManager.discoverServices("_socket._tcp.local", mNsdManager.PROTOCOL_DNS_SD, this);
				mNsdManager.discoverServices("_socket._tcp", mNsdManager.PROTOCOL_DNS_SD, this);
//				mNsdManager.registerService(serviceInfo,mNsdManager.PROTOCOL_DNS_SD,this);
			}catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}
	}
	@Override
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub
		Log.v("asdf", "onPageScrollStateChanged");
	}
	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		// TODO Auto-generated method stub
		// Log.v("asdf", "onPageScrolled");
	}
	@Override
	public void onPageSelected(int arg0) {
		// TODO Auto-generated method stub
		Log.v("asdf", "onPageSelected");
		getTabState(arg0);
	}
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		// TODO Auto-generated method stub
		switch (checkedId) {
		case R.id.radio0:
			pager.setCurrentItem(0);
			break;
		case R.id.radio1:
			pager.setCurrentItem(1);
			break;
		case R.id.radio2:
			pager.setCurrentItem(2);
			break;
		case R.id.radio3:
			pager.setCurrentItem(3);
				break;
		default:
			break;
		}
	}
	private void getTabState(int index) {
		// TODO Auto-generated method stub
		button0.setChecked(false);
		button1.setChecked(false);
		button2.setChecked(false);
		button3.setChecked(false);
		switch (index) {
		case 0:
			button0.setChecked(true);
			break;
		case 1:
			button1.setChecked(true);
			break;
		case 2:
			button2.setChecked(true);
			break;
		case 3:
			button3.setChecked(true);
			break;
		default:
			break;
		}
	}
	public void onKeyBack(int i)
	{
		if (i>0)
			i--;
		else
		return;
		if (pager.getCurrentItem()==0)
		{
			Fragment_A fragment_a = (Fragment_A)fragments.get(pager.getCurrentItem());
			ArrayList<Fragment>  backStack = fragment_a.backStack;
			if (backStack.size()==1)
			{
				getSupportFragmentManager().beginTransaction().hide(backStack.get(backStack.size()-1)).commit();
			}
			else
			{
				getSupportFragmentManager().beginTransaction().hide(backStack.get(backStack.size()-1)).show(backStack.get(backStack.size()-2)).commit();
			}
			backStack.remove(backStack.size()-1);
		}
		else if (pager.getCurrentItem()==1)
		{
			ColorSelectOneActivity fragment_b = (ColorSelectOneActivity)fragments.get(pager.getCurrentItem());
			ArrayList<Fragment>  backStack = fragment_b.backStack;
			if (backStack.size()==1)
			{
				getSupportFragmentManager().beginTransaction().hide(backStack.get(backStack.size()-1)).commit();
			}
			else
			{
				getSupportFragmentManager().beginTransaction().hide(backStack.get(backStack.size()-1)).show(backStack.get(backStack.size()-2)).commit();
			}
			backStack.remove(backStack.size()-1);
		}
		onKeyBack(i);
	}
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK
				&& event.getRepeatCount() == 0) {
			onKeyBack(1);
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
	/**
	 * 设备像素(dip,dp)转屏幕像素(px)
	 * px就是像素,假如用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
	      * 而dip,就是把屏幕的高分成480分,宽分成320分。例如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。
	 * @param context
	 * @param dipValue
	 * @return
	 */
	public static int dip2px(Context context, float dipValue){
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int)(dipValue * scale + 0.5f);
	}
	/**
	 * 将px值转换为sp值,保证文字大小不变
	 *
	 * @param pxValue
	 * @param pxValue
	 *            (DisplayMetrics类中属性scaledDensity)
	 * @return
	 */
	public static int px2sp(Context context, float pxValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (pxValue / fontScale + 0.5f);
	}
	/**
	 * 将sp值转换为px值,保证文字大小不变
	 *
	 * @param spValue
	 * @param spValue
	 *            (DisplayMetrics类中属性scaledDensity)
	 * @return
	 */
	public static int sp2px(Context context, float spValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (spValue * fontScale + 0.5f);
	}
	//实现网络发现接口
	// Called as soon as service discovery begins.
	@Override
	public void onDiscoveryStarted(String regType) {
		Log.d(TAG, "Service discovery started");
		isDescovering = true;
	}
	@Override
	public void onServiceFound(NsdServiceInfo service) {
		// A service was found! Do something with it.
		if (service.getServiceName().contains("WokeSmart")) {
			// Service type is the string containing the protocol and
			// transport layer for this service.
			Log.d(TAG, "WokeSmart device found");
			mNsdManager.resolveService(service, this);
		}
	}
	@Override
	public void onServiceLost(NsdServiceInfo service) {
		// When the network service is no longer available.
		// Internal bookkeeping code goes here.
		Log.e(TAG, "service lost" + service);
	}
	@Override
	public void onDiscoveryStopped(String serviceType) {
		Log.i(TAG, "Discovery stopped: " + serviceType);
	}
	@Override
	public void onStartDiscoveryFailed(String serviceType, int errorCode) {
		Log.e(TAG, "Discovery failed: Error code:" + errorCode);
		mNsdManager.stopServiceDiscovery(this);
	}
	@Override
	public void onStopDiscoveryFailed(String serviceType, int errorCode) {
		Log.e(TAG, "Discovery failed: Error code:" + errorCode);
		mNsdManager.stopServiceDiscovery(this);
	}
	@Override
	public void onServiceResolved(NsdServiceInfo arg0) {
		// 可以再这里获取相应网络服务的地址及端口信息,然后决定能否要与之建立连接。
		// 之后就是一些socket操作了
		//获取IP
		arg0.getHost();
		//获取端口
		arg0.getPort();
        AppDelegate delegate = (AppDelegate)getApplication();
        delegate.put("host", arg0.getHost().getAddress());
        delegate.put("port", arg0.getPort());
	}
	@Override
	public void onResolveFailed(NsdServiceInfo arg0, int arg1) {
		Log.e(TAG, "ResolveFailed failed: Error code:" + arg1);
		mNsdManager.stopServiceDiscovery(this);
	}
	@Override
	public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
		Log.e(TAG, "register failed" + errorCode);
	}
	@Override
	public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
		Log.e(TAG, "unregister failed" + errorCode);
	}
	@Override
	public void onServiceRegistered(NsdServiceInfo serviceInfo) {
		Log.e(TAG, "registed");
	}
	@Override
	public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
		Log.e(TAG, "unregisted");
	}
}
解决方案:20分
应该不是重启,而是虚拟机挂掉了
解决方案:80分
大哥,你写的代码也太坑了..你这桌子项目本人在接手,求指导决这个NsdManager – –

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明调用NsdService相关api导致手机重启(随机)