Android 在类中使用线程

Android 在类中使用线程,android,multithreading,Android,Multithreading,hii我正在开发一个应用程序,在其中我可以获得位置和速度。现在,当用户处于速度时,我会在用户面前显示一个屏幕,上面有两个按钮。在我们限制的区域也这样做。用户必须发送短信给家长,如果他在速度或区域。 但我遇到了一个问题,随着用户速度的提高,我的屏幕无法显示,手机被挂断,应用程序处于应用程序无响应模式。我也为此应用了线程,但没有成功,请检查我的代码,并指导我是否有任何问题。如果第一个屏幕出现,而不是单击按钮,它将出现与上述相同的情况 public class CheckLocation extend

hii我正在开发一个应用程序,在其中我可以获得位置和速度。现在,当用户处于速度时,我会在用户面前显示一个屏幕,上面有两个按钮。在我们限制的区域也这样做。用户必须发送短信给家长,如果他在速度或区域。 但我遇到了一个问题,随着用户速度的提高,我的屏幕无法显示,手机被挂断,应用程序处于应用程序无响应模式。我也为此应用了线程,但没有成功,请检查我的代码,并指导我是否有任何问题。如果第一个屏幕出现,而不是单击按钮,它将出现与上述相同的情况

public class CheckLocation extends Service{

    private static final String TAG = "CheckLocation";
    private LocationManager lm;
    LocationListener locationListener;
    private float speed,speedinMiles,Speedvalue,lastSpeed;
    private double lattitude=25.66;
    private double longtitude=32.45;
    private Context context;
    String IMEI,result,speedStatus,wantSpeedAlert,addwithData,alertAdd,status;
    String []child,parentNumber;
    String serverAdd= SERVER ADDRESS FOR SAVING LOCATION DATA IN DATABASE;
    String speedAlert=SERVER ADDRESS FOR SENDING MAIL
    PendingIntent pendingIntent;
    CursorHandler cursorHandler;
    boolean zoneFlag,isState,isRestrictedZone,alreadyRunning=false;
     JSONArray jArray;
     JSONObject  json_data=new JSONObject();
     SendingSmsEmail sendingSmsEmail;
     int enter=0,exit=0,speedIntent=0;




    public CheckLocation(Context context)
    {
        this.context = context;

    }


    public CheckLocation() 
    {
        Log.d(TAG,"in constructor of check location");

    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public void onCreate() 
    {
        Log.d(TAG, "onCreate()");
        super.onCreate();

        cursorHandler=new CursorHandler(this);
        TelephonyManager telephonyManager=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
        IMEI = telephonyManager.getDeviceId();
        Log.d(TAG,"imei number of phone..got it.."+IMEI);

        status=getStatus();
        Log.d(TAG, "status of speed sms.."+status);
        Log.d(TAG, "starting service");
        startService();

    }

    private void startService() 
    {
        Log.d(TAG, "startService()");
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locationListener = new MyLocationListener();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
        Log.d(TAG, "calling location listener");
    }

    private class MyLocationListener implements LocationListener 
    {

        public void onLocationChanged(Location loc)
        {
            Log.d(TAG, "onLocationChanged()");

            if (loc != null)
            {

                lattitude=loc.getLatitude();
                longtitude=loc.getLongitude();
                lastSpeed = speed;
                speed = loc.getSpeed();


// CHANGING SPPEED IN MILES PER SECOND

                speedinMiles=(float) (speed*2.2369362920544);
                Log.d(TAG, "speed in miles.."+speedinMiles);
                loc.setSpeed(speedinMiles);

//BROADCASTING SPEED INTENT             

                Intent intent = new Intent(SOMECLASS.INTENT_SPEED_CHECK);
                intent.putExtra("speed", speedinMiles);
                intent.putExtra("lattitude",lattitude);
                intent.putExtra("longitude", longtitude);
                sendBroadcast(intent);
                Log.d(TAG, "Intent Broad casted");

//SAVING LOCATION DATA IN DATABSE               

                saveData(lattitude,longtitude);

//  CHECKING SPEED
                if(speedinMiles>20)
                {
                    new CheckSpeedTask().execute(status);// HERE STATUS IS FOR IF WE WANT TO SEND SMS OR NOT
                }
                else
                {
                    Log.d(TAG, "user is not in speed ");
                    speedIntent=0;
                }



                }




            }

        public void onProviderDisabled(String provider)
        {
            Log.d(TAG, "onProviderDisabled,enableing network provider");
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);
            Log.d(TAG, "Network provider enabled");


        }

        public void onProviderEnabled(String provider) {

            Log.d(TAG, "onProviderEnabled");
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {

            Log.d(TAG, "onStatusChanged)");

        }
    }

    public float getCurrentSpeed() {
        return speedinMiles;
    }
    public double getCurrentLattitude() {
        return lattitude;
    }
    public double getCurrentLongitude() {
        return longtitude;
    }

    public float getLastSpeed() {
        return lastSpeed;
    }


    private String getStatus() 
    {
        //child=conntectionHandler.post(childstatus);
        child=cursorHandler.getData("status");
         for (int i = 0; i < child.length; i++) 
            {

                  Log.d(TAG,"status["+i+"]"+child[i]);
                  speedStatus=child[i];
                 System.out.println("status."+speedStatus);


            } 
        wantSpeedAlert=speedStatus.substring(speedStatus.indexOf(",")+1,speedStatus.lastIndexOf(","));
        System.out.println("speed alert is.."+wantSpeedAlert);

        return wantSpeedAlert;
    }

    void saveData(double lattitude2, double longtitude2)
    {
        try{        

            Log.d(TAG,"Saving...latt.."+lattitude+"..long.."+longtitude);

            addwithData=serverAdd+IMEI+"&latitude="+lattitude2+"&longitude="+longtitude2;
            Log.d(TAG,"completeServerAdd.."+addwithData);
         HttpClient httpclient = new DefaultHttpClient();
           HttpGet httpGet=new HttpGet(addwithData);
            HttpResponse response = httpclient.execute(httpGet); 
           Log.d(TAG, response.toString());
            Log.d(TAG,"server Connected"); 
            Log.i(TAG,"data inserted");

        }
        catch(Exception e)
        {

            Log.e(TAG, "Error converting result "+e.getMessage());

        }
    }


    private class CheckSpeedTask extends AsyncTask<String,Void,Void>
    {
        @Override
        protected Void doInBackground(String... status) 
        {
            Log.d(TAG, "CHECK SPEED TASK");
            String statusForMail=status[0];
            if(statusForMail.equalsIgnoreCase("y"))
            {           

                System.out.println("speed Alert status is..."+statusForMail);

                if(speedIntent==0)
                {
                        //sending mail and sms to parent
                        alertAdd=speedAlert+IMEI+"&speed="+speedinMiles;
                        Log.d(TAG, "address for speed alert."+alertAdd);
                        Log.d(TAG, "prompting server ");
                        try 
                        {
                         HttpClient httpClient = new DefaultHttpClient();
                        HttpGet  httpGet=new HttpGet(alertAdd);
                        HttpResponse response = httpClient.execute(httpGet);
                          Log.d(TAG,"mail send");
                          speedIntent=1;

                        } 
                        catch (Exception e)
                        {
                            Toast.makeText(context,"Sever Connection Problem",Toast.LENGTH_LONG);
                            e.printStackTrace();

                        }
                }
                else
                {
                    Log.d(TAG, "speed intent value is 1 so not sending mail");
                }

            }
            else
            {

                Log.d(TAG, "Speed alert status is negative");
            }
            return null;

        }

        @Override
        protected void onPostExecute(Void result)
        {
            Log.d(TAG, "Starting Intent");
            Intent screenIntent=new Intent(getApplicationContext(),SpeedScreen.class);
            screenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            screenIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            getApplicationContext().startActivity(screenIntent);    
            Log.d(TAG, "new Activity Starts");

        }
    }


}
公共类CheckLocation扩展服务{
私有静态最终字符串TAG=“CheckLocation”;
私人位置经理lm;
LocationListener LocationListener;
私人浮动速度、speedinMiles、Speedvalue、lastSpeed;
私人双格子=25.66;
私人双倍长度=32.45;
私人语境;
字符串IMEI、结果、速度状态、WantSpeedAllert、addwithData、alertAdd、状态;
字符串[]子项,父项编号;
String serverAdd=用于在数据库中保存位置数据的服务器地址;
String speedAlert=用于发送邮件的服务器地址
下垂的下垂的;
游标处理器游标处理器;
布尔zoneFlag、isState、isRestrictedZone、alreadyRunning=false;
杰索纳雷·贾雷;
JSONObject json_data=new JSONObject();
SendingSmsEmail SendingSmsEmail;
int enter=0,exit=0,speedIntent=0;
公共检查位置(上下文)
{
this.context=上下文;
}
公共检查位置()
{
Log.d(标记“检查位置的构造函数中”);
}
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate()
{
d(标记“onCreate()”);
super.onCreate();
cursorHandler=新的cursorHandler(此);
TelephonyManager TelephonyManager=(TelephonyManager)this.getSystemService(Context.TELEPHONY_服务);
IMEI=telephonyManager.getDeviceId();
Log.d(标记“imei电话号码..收到..”+imei);
status=getStatus();
日志d(标签“速度短信状态”+状态);
Log.d(标签“启动服务”);
startService();
}
私有void startService()
{
Log.d(标记“startService()”);
lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
locationListener=新建MyLocationListener();
lm.RequestLocationUpdate(LocationManager.GPS_提供程序,0,0,locationListener);
Log.d(标记“调用位置侦听器”);
}
私有类MyLocationListener实现LocationListener
{
位置更改后的公共无效(位置loc)
{
Log.d(标记“onLocationChanged()”);
如果(loc!=null)
{
lattitude=loc.getLatitude();
longtudent=loc.getLongitude();
最后速度=速度;
速度=loc.getSpeed();
//以英里/秒为单位更改速度
速度英里数=(浮动)(速度*2.2369362920544);
Log.d(标记“以英里为单位的速度…”+以英里为单位的速度);
位置设定速度(速度英里);
//广播速度意向
意向意向=新意向(SOMECLASS.Intent\u SPEED\u CHECK);
意图。额外(“速度”,speedinMiles);
意向。额外(“格度”,格度);
意向。额外(“经度”,经度);
发送广播(意图);
日志d(标签“浇铸”);
//在数据库中保存位置数据
保存数据(格度、长度);
//检查速度
如果(车速英里数>20)
{
new CheckSpeedTask().execute(status);//这里的status表示是否发送短信
}
其他的
{
Log.d(标记“用户未处于速度”);
speedIntent=0;
}
}
}
公共无效onProviderDisabled(字符串提供程序)
{
Log.d(标记“onProviderDisabled,enableing network provider”);
lm.RequestLocationUpdate(LocationManager.NETWORK_提供程序,0,0,locationListener);
Log.d(标记“已启用网络提供商”);
}
公共无效onProviderEnabled(字符串提供程序){
Log.d(标签“onProviderEnabled”);
}
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
Log.d(标签“onStatusChanged”);
}
}
公共浮点getCurrentSpeed(){
返回速度以英里为单位;
}
公共双getCurrentLattitude(){
返回格度;
}
公共双GetCurrent经度(){
回归长久;
}
公共浮点getLastSpeed(){
返回速度;
}
私有字符串getStatus()
{
//child=contectionhandler.post(childstatus);
child=cursorHandler.getData(“状态”);
for(int i=0;ipublic class CheckLocation extends Service{

    private static final String TAG = "CheckLocation";
    private LocationManager lm;
    LocationListener locationListener;
    private float speed,speedinMiles,Speedvalue,lastSpeed;
    private double lattitude=25.66;
    private double longtitude=32.45;
    private Context context;
    String IMEI,result,speedStatus,wantSpeedAlert,addwithData,alertAdd,status;
    String []child,parentNumber;
    String serverAdd= SERVER ADDRESS FOR SAVING LOCATION DATA IN DATABASE;
    String speedAlert=SERVER ADDRESS FOR SENDING MAIL
    PendingIntent pendingIntent;
    CursorHandler cursorHandler;
    boolean zoneFlag,isState,isRestrictedZone,alreadyRunning=false;
     JSONArray jArray;
     JSONObject  json_data=new JSONObject();
     SendingSmsEmail sendingSmsEmail;
     int enter=0,exit=0,speedIntent=0;




    public CheckLocation(Context context)
    {
        this.context = context;

    }


    public CheckLocation() 
    {
        Log.d(TAG,"in constructor of check location");

    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public void onCreate() 
    {
        Log.d(TAG, "onCreate()");
        super.onCreate();

        cursorHandler=new CursorHandler(this);
        TelephonyManager telephonyManager=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
        IMEI = telephonyManager.getDeviceId();
        Log.d(TAG,"imei number of phone..got it.."+IMEI);

        status=getStatus();
        Log.d(TAG, "status of speed sms.."+status);
        Log.d(TAG, "starting service");
        startService();

    }

    private void startService() 
    {
        Log.d(TAG, "startService()");
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locationListener = new MyLocationListener();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
        Log.d(TAG, "calling location listener");
    }

    private class MyLocationListener implements LocationListener 
    {

        public void onLocationChanged(Location loc)
        {
            Log.d(TAG, "onLocationChanged()");

            if (loc != null)
            {

                lattitude=loc.getLatitude();
                longtitude=loc.getLongitude();
                lastSpeed = speed;
                speed = loc.getSpeed();


// CHANGING SPPEED IN MILES PER SECOND

                speedinMiles=(float) (speed*2.2369362920544);
                Log.d(TAG, "speed in miles.."+speedinMiles);
                loc.setSpeed(speedinMiles);

//BROADCASTING SPEED INTENT             

                Intent intent = new Intent(SOMECLASS.INTENT_SPEED_CHECK);
                intent.putExtra("speed", speedinMiles);
                intent.putExtra("lattitude",lattitude);
                intent.putExtra("longitude", longtitude);
                sendBroadcast(intent);
                Log.d(TAG, "Intent Broad casted");

//SAVING LOCATION DATA IN DATABSE               

                saveData(lattitude,longtitude);

//  CHECKING SPEED
                if(speedinMiles>20)
                {
                    new CheckSpeedTask().execute(status);// HERE STATUS IS FOR IF WE WANT TO SEND SMS OR NOT
                }
                else
                {
                    Log.d(TAG, "user is not in speed ");
                    speedIntent=0;
                }



                }




            }

        public void onProviderDisabled(String provider)
        {
            Log.d(TAG, "onProviderDisabled,enableing network provider");
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListener);
            Log.d(TAG, "Network provider enabled");


        }

        public void onProviderEnabled(String provider) {

            Log.d(TAG, "onProviderEnabled");
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {

            Log.d(TAG, "onStatusChanged)");

        }
    }

    public float getCurrentSpeed() {
        return speedinMiles;
    }
    public double getCurrentLattitude() {
        return lattitude;
    }
    public double getCurrentLongitude() {
        return longtitude;
    }

    public float getLastSpeed() {
        return lastSpeed;
    }


    private String getStatus() 
    {
        //child=conntectionHandler.post(childstatus);
        child=cursorHandler.getData("status");
         for (int i = 0; i < child.length; i++) 
            {

                  Log.d(TAG,"status["+i+"]"+child[i]);
                  speedStatus=child[i];
                 System.out.println("status."+speedStatus);


            } 
        wantSpeedAlert=speedStatus.substring(speedStatus.indexOf(",")+1,speedStatus.lastIndexOf(","));
        System.out.println("speed alert is.."+wantSpeedAlert);

        return wantSpeedAlert;
    }

    void saveData(double lattitude2, double longtitude2)
    {
        try{        

            Log.d(TAG,"Saving...latt.."+lattitude+"..long.."+longtitude);

            addwithData=serverAdd+IMEI+"&latitude="+lattitude2+"&longitude="+longtitude2;
            Log.d(TAG,"completeServerAdd.."+addwithData);
         HttpClient httpclient = new DefaultHttpClient();
           HttpGet httpGet=new HttpGet(addwithData);
            HttpResponse response = httpclient.execute(httpGet); 
           Log.d(TAG, response.toString());
            Log.d(TAG,"server Connected"); 
            Log.i(TAG,"data inserted");

        }
        catch(Exception e)
        {

            Log.e(TAG, "Error converting result "+e.getMessage());

        }
    }


    private class CheckSpeedTask extends AsyncTask<String,Void,Void>
    {


        @Override
        protected Void doInBackground(String... status) 
        {
            Log.d(TAG, "CHECK SPEED TASK");
            String statusForMail=status[0];
            if(statusForMail.equalsIgnoreCase("y"))
            {           

                System.out.println("speed Alert status is..."+statusForMail);

                if(speedIntent==0)
                {
                        //sending mail and sms to parent
                        alertAdd=speedAlert+IMEI+"&speed="+speedinMiles;
                        Log.d(TAG, "address for speed alert."+alertAdd);
                        Log.d(TAG, "prompting server ");
                        try 
                        {
                         HttpClient httpClient = new DefaultHttpClient();
                        HttpGet  httpGet=new HttpGet(alertAdd);
                        HttpResponse response = httpClient.execute(httpGet);
                          Log.d(TAG,"mail send");
                          speedIntent=1;

                        } 
                        catch (Exception e)
                        {
                            Toast.makeText(context,"Sever Connection Problem",Toast.LENGTH_LONG);
                            e.printStackTrace();

                        }
                }
                else
                {
                    Log.d(TAG, "speed intent value is 1 so not sending mail");
                }

            }
            else
            {

                Log.d(TAG, "Speed alert status is negative");
            }

             Log.d(TAG, "Starting Intent");
            Intent screenIntent=new Intent(getApplicationContext(),SpeedScreen.class);
            screenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            screenIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            getApplicationContext().startActivity(screenIntent);    
            Log.d(TAG, "new Activity Starts");



            return null;

        }


        }
    }


}