如何在android中停止扩展Thread类?

时间:2014-08-21 07:51:08

标签: java android multithreading ui-thread

我使用调用函数来javascript到android。我使用我的android代码下面如何停止用于MyBackgroudMethod mThread的android mthread.i但是我想在sendCheckOutBackgroundKill()中停止这个线程;如何可能。请帮助我!!!

public class EmployeeManager extends CordovaActivity implements
LocationListener{
    JavaScriptInterface jsInterface;
    LocationManager locationManager;
    boolean isGPSEnabled = false;
    boolean network_enabled = false;
    String provider;
    String lati = "";
    String latlong = "";
    String accuracy = "";
    Location currentLocation;
    LocationManager mLocationManager;   
    String devieID = "";
    boolean backgroundtask = false;
    String iSGps = "";
    String mTime="";
    String mEmployeeId="";
    String mAttendanceId="";
    MyBackgroudMethod mThread;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_employee_manager_main);
        super.loadUrl("file:///android_asset/www/index.html");  
        //mThread = new MyBackgroudMethod();
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);

        /**/
        jsInterface = new JavaScriptInterface(EmployeeManager.this);
        appView.addJavascriptInterface(jsInterface, "JSInterface");
        appView.getSettings().setJavaScriptEnabled(true);
        appView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        devieID = getUniquePsuedoID();

        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        network_enabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        // Creating an empty criteria object
                Criteria criteria = new Criteria();

                // Getting the name of the provider that meets the criteria
                provider = locationManager.getBestProvider(criteria, false);

                if (provider != null && !provider.equals("")) {

                    // Get the location from the given provider
                    Location location = locationManager.getLastKnownLocation(provider);
                    if (isGPSEnabled) {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
                    } else if (network_enabled) {
                        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
                    }

                    // locationManager.requestLocationUpdates(provider, 1000, 0, this);

                    if (location != null) {
                        onLocationChanged(location);
                    } else {
                        Toast.makeText(getBaseContext(), "Location can't be retrieved",
                                Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getBaseContext(), "No Provider Found",Toast.LENGTH_SHORT).show();
                }

    }
    public static String getUniquePsuedoID()
     {
         String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);
         String serial = null;
         try
         {
             serial = android.os.Build.class.getField("SERIAL").get(null).toString();
             return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
         }
         catch (Exception e)
         {
             serial = "serial"; // some value
         }
         return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
     }


    public class JavaScriptInterface {
        public Activity mContext;
        public JavaScriptInterface(Activity c) {
            this.mContext = c;
        }

        @JavascriptInterface
        public void sendToAndroid(boolean deviceID) {
            Log.v("log", "Sent TO android");
            runOnUiThread(new Runnable() {
                public void run() {
                    appView.loadUrl("javascript:passLatLong(\"" + lati + "\",\"" + latlong + "\",\"" + accuracy + "\");");
                    appView.setEnabled(false);      
                }
            });
        }

        @JavascriptInterface
        public void sendToDeviceId() {
            runOnUiThread(new Runnable() {
                public void run() {
                    appView.loadUrl("javascript:passDevieId(\"" + devieID + "\");");
                }
            });
        }   
        @JavascriptInterface        
        public void sendCheckInBackground(String time, String employeeId, String attendanceId) {
            mTime= time;
            mEmployeeId = employeeId;
            mAttendanceId = attendanceId;                   
            runOnUiThread(new Runnable() {
                public void run() {                                     
                    Toast.makeText(EmployeeManager.this, "Check In Background Native", 3000).show();
                    mThread = new MyBackgroudMethod();
                    mThread.setDaemon(true);
                    mThread.start();
                }
            });
        }

        public void sendCheckOutBackgroundKill() {
            runOnUiThread(new Runnable() {
                public void run() {                 
                    Toast.makeText(EmployeeManager.this, "Check Out Background Native Kill", 3000).show();
                    mThread.interrupt();
                }
            });

        }
    }       

    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
        alertDialog.setTitle("GPS is settings");  
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        });  
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });  
        alertDialog.show();
    }   

    private class MyBackgroudMethod extends Thread {

        @Override
        public void run() {
            while (true) {


                checkInternetConnection();

                try {

                    Thread.sleep(Integer.parseInt(mTime)*60*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    private void checkInternetConnection() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // test for connection
        if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {

            new JSONTask().execute(mTime,mEmployeeId,mAttendanceId);

        } else {


            Log.v(TAG, "Internet Connection Not Present");

        }
    }

    @Override
    public void onLocationChanged(Location location) {



        if(location.getAccuracy() < 400) {
            lati = Double.toString(location.getLatitude());
            latlong = Double.toString(location.getLongitude());
            accuracy = Double.toString(location.getAccuracy());
        }

    }

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

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

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

    public class JSONTask extends AsyncTask<String, Void, String> {

        public void onPreExecute() {
            // progress.show();
        }

        protected String doInBackground(String... arg) {
            // This value will be returned to your
            // onPostExecute(result) method


            String time1 = arg[0];
            String employeeId2 = arg[1];
            String attendenceId2 = arg[2];



            String img_url = DBAdpter.onFieldCheckIn(employeeId2, attendenceId2, lati, latlong, accuracy);

            return img_url;
        }

        protected void onPostExecute(String result) {

            Toast.makeText(EmployeeManager.this, "JSON TASK", 4000).show();             
        }


    }
}

1 个答案:

答案 0 :(得分:0)

中断后循环没有退出。放个“休息”在catch子句中。就是这样。