需要帮助调试我的android-java代码

时间:2012-02-02 23:27:52

标签: java android eclipse

Log cat显示“运行时异常 - 无法在未调用looper.prepare的线程内创建处理程序?我想在固定的时间间隔后通过短信将我的手机的位置更新发送到其他手机。请帮助。建议节省电力的方法也是

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 et1 = (EditText)findViewById(R.id.editText1);
 et2 = (EditText)findViewById(R.id.editText2);
 b1  = (Button)findViewById(R.id.button1 );
 t1 = new Timer();
 t2 = new Timer();
 lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 listener = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        SmsManager sm = SmsManager.getDefault();
         String message = String.format(
                    "New Location \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude()             );
        String number = "5556";
        sm.sendTextMessage(number,null,message,null,null);
    }
};

在每个固定时间间隔后安排请求更新

t1.scheduleAtFixedRate(new TimerTask(){

    @Override
    public void run() {
        // TODO Auto-generated method stub
        lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, listener,null);
    }
},0,300000);

}

}

2 个答案:

答案 0 :(得分:1)

TimerTask文档中不清楚,但我怀疑每个任务都在自己的线程上运行。此外,您正在使用的LocationManager.requestSingleUpdate调用的文档说“如果looper为null,则将在主线程上调用回调”,但我怀疑这是错误的,因为它不同意具有备选方案的那个签名,其中说“如果looper为null,那么将在当前线程上调用回调”。如果后者是正确的,那么这可以解释您的问题,因为您在requestSingleUpdate主题中调用了TimerTask,而Looper主题没有null

或许使用getMainLooper而不是requestSingleUpdate的结果作为{{1}}的最后一个参数。

答案 1 :(得分:0)

该错误基本上意味着“您正在尝试在后台线程中执行某些操作,而您不允许在后台线程中执行此操作。

您的侦听器将处理位置请求的异步性质。你不需要线程化。

如果您需要线程化的内容,请阅读Asynctask