解决android出现static void xxx No enclosing instance of type xxx is accessible

在静态类new一个实例时,会产生这个错误,参考下面这篇文章时,发现static main却可以。于是我做了一些实验,发现也报错了。经过调试,发现如果你要在static 函数里面new一个类,这个类必须是独立的一个java 文件。

对Thread.interrupt()方法很详细的介绍

http://blog.sina.com.cn/s/blog_6ca570ed01016mti.html


例子:


AsynTask.java

public class AsynTask implements Runnable{

	private double d = 0.0;
	
	public void run() {
			
		while(!Thread.interrupted()){
			System.out.println("I am running!");

			for (int i = 0; i < 900000; i++) {
			d = d + (Math.PI + Math.E) / d;
			}
			}
		}
		
}

TestThread.java代码

public class TestThread {
 

		public static void main(String[] args) throws Exception{
			//将任务交给一个线程执行
			Thread t = new Thread(new AsynTask());
			t.start();
	
			//运行一断时间中断线程
			Thread.sleep(100);
			System.out.println("****************************");
			System.out.println("Interrupted Thread!");
			System.out.println("****************************");
			t.interrupt();
			
			t = new Thread(new AsynTask());
			t.start();
			//运行一断时间中断线程
			Thread.sleep(100);
			System.out.println("****************************");
			System.out.println("Interrupted Thread!");
			System.out.println("****************************");
			t.interrupt();
			
			
			
		}
}	

把static函数中的new实例对应的类,用Java file单独定义,就通过编译了。

原理不大懂,但大概可以知道,java中的static函数不能new一个子类,却可以new一个独立的类。


这样,我在Android设计时遇到的难题就解决了。我想在一个公用的static类中new一个实例,那这个实例对应的类定义不要放在这个公用类,而单独出来就可以了。

例如下图,BTController提供很多static 方法供Activity调用


但线程被终止后,必须new,如下

	public static void startConnection(String pAddr){


		mBTAdp.cancelDiscovery();
		
		if(mBTSocket!=null){
			//close old socket first
			if(mBTSocket.isConnected()){
				try {
					mBTSocket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		stopGlobalThread();

		mConnectThread =  new ConnectThread();
		mConnectThread.setAddress(pAddr);
		mConnectThread.start();
	
	}
	
	private static void stopGlobalThread() {
		if(mConnectThread!=null){
			mConnectThread.interrupt();
			mConnectThread = null;
		}
	}
因为每次startConnection(),都必须重启ConnectThread,因此必须在static startConnection()中new ConnectThread(),通过上面的实验,我把子类ConnectThread()单独出来了。题目中的错误就不报了。


接着这个实验,下一篇会总结下Android中如何中断一个线程并重启。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值