Monday, May 14, 2012

Android Threading (Basic)

Thread
A thread is a sequential path of code execution within a program. And each thread has its own local variables, program counter and lifetime.

in this example we create simplest thread by implementing Runnable interface.


Start Coding.. so lets move ahead with some coding..

create a Simple Android App Name "AndroidThreadingBasic" with 2.3.3 SDK,

your Activity should be like this.

 
package com.rdc;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyActivity extends Activity implements OnClickListener {
    
 //Declear the button and Textview instance variable
 private Button btnStart=null; 
 private TextView tv=null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //get the id of Button from xml file
        btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(this);
        
      //get the id of TextView from xml file
        tv = (TextView) findViewById(R.id.textView1);
        tv.setVisibility(View.INVISIBLE);
        
        
    }

 public void onClick(View v) {
  if(v==btnStart){ 
   
    tv.setVisibility(View.VISIBLE);
   
    // create thread by implementing Runnable interface
    new Thread(new Runnable() {
    
          public void run() {
          System.out.println("Thread is running now..");
             
          for(int i=1;i<=10;i++){
             System.out.println(i);
             }
          }
          
      }).start();  
   
  }
  
 }
}

Now put this code in your main.xml file

    
        
    
            
    



The output Screen will be like this..

and check your logcat, it will print 1 to 10 integers with message.

Note : if you want to update UI then you should use Handler or AsyncTask Thread Check my Blogs below

Android Threading with Handler and  

Android Threading With AsyncTask



I'd love to hear your thoughts! 

Thursday, May 3, 2012

Calculate Device Moving Speed Programmatically

so this evening i would like to share with you new thing what i have learn..

some time we need to calculate moving speed of our android mobile device.

this example will calculate the location coordinates latitude-longitude after every 5 seconds gap.
and then calculate the speed of device in m/s.
all work done in background by the service.

so i we need to do is install this app into mobile and close now it started a background service
and calculate the speed forever..
[you can create without any activity also, but i have created an activity ans started the service from activity]

let's begin the coding, first of all we need to create a simple project having single activity like this
DeviceMovingSpeed.java
  
package com.rdc;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class DeviceMovingSpeed extends Activity// implements Runnable
{
    /** Called when the activity is first created. */
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.v("Debug", "Activity started..");
        Intent myIntent=new Intent(this,MyService.class);  
  startService(myIntent);  
    } 
}

Now we need to create a service where we will handle all the stuff creating a thread Getting current location calculating coordinates latitude-longitude calculating distance and device moving speed
MyService.java
  
package com.rdc;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service
{ 
 private LocationManager locManager;
 private LocationListener locListener = new myLocationListener();
 static final Double EARTH_RADIUS = 6371.00;
 
 private boolean gps_enabled = false;
 private boolean network_enabled = false;
 
 private Handler handler = new Handler();
 Thread t;
 
   @Override
   public IBinder onBind(Intent intent) {return null;}
   @Override
   public void onCreate() {}
   @Override
   public void onDestroy() {}
   @Override
   public void onStart(Intent intent, int startid) {}   
   @Override
 public int onStartCommand(Intent intent, int flags, int startId){
 
 Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_SHORT).show();
   
 final Runnable r = new Runnable()
 {   public void run() 
     {
   Log.v("Debug", "Hello");
   location();
   handler.postDelayed(this, 5000);
     }
 };
  handler.postDelayed(r, 5000);  
       return START_STICKY; 
 }
   
   public void location(){
 locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  
 try{
 gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
 }
 catch(Exception ex){}
 try{
 network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);    
 }
 catch(Exception ex){}
 Log.v("Debug", "in on create.. 2");   
 if (gps_enabled) {
 locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locListener);
 Log.v("Debug", "Enabled..");
 }
 if (network_enabled) {
 locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locListener);
 Log.v("Debug", "Disabled..");
 }
 Log.v("Debug", "in on create..3");
 }   
 
   private class myLocationListener implements LocationListener
   {
      double lat_old=0.0;
      double lon_old=0.0;
      double lat_new;
      double lon_new;
      double time=10;
      double speed=0.0;
      @Override
 public void onLocationChanged(Location location) {   
 Log.v("Debug", "in onLocation changed..");   
 if(location!=null){    
 locManager.removeUpdates(locListener);    
 //String Speed = "Device Speed: " +location.getSpeed();
 lat_new=location.getLongitude();
 lon_new =location.getLatitude();
 String longitude = "Longitude: " +location.getLongitude();
 String latitude = "Latitude: " +location.getLatitude();    
 double distance =CalculationByDistance(lat_new, lon_new, lat_old, lon_old);    
 speed = distance/time;     
 Toast.makeText(getApplicationContext(), longitude+"\n"+latitude+"\nDistance is: "
   +distance+"\nSpeed is: "+speed , Toast.LENGTH_SHORT).show();
 lat_old=lat_new;
 lon_old=lon_new;
 }
 }
 @Override
 public void onProviderDisabled(String provider) {}
 @Override
 public void onProviderEnabled(String provider) {}
 @Override
 public void onStatusChanged(String provider, int status, Bundle extras) {}    
   }   
   
   public double CalculationByDistance(double lat1, double lon1, double lat2, double lon2) {
  double Radius = EARTH_RADIUS;
  double dLat = Math.toRadians(lat2-lat1);  
  double dLon = Math.toRadians(lon2-lon1);  
  double a = Math.sin(dLat/2) * Math.sin(dLat/2) +  
  Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *  
  Math.sin(dLon/2) * Math.sin(dLon/2);  
  double c = 2 * Math.asin(Math.sqrt(a));  
  return Radius * c;
   }   
}

now come to AndroidManifest.xml
  


    


    
        
            
                
                
            
                
        
   
           
              
              
           
      
    


okay!! that's it.. now run the application toast will appear to say :-
"current coordinates"
"distance if device is moving"
"and speed of device in m/s (meter/seconds)"

 cheers!!

 I'd love to hear your thoughts!