android multithreading
===

I have trouble using `thread.join` in my code below. It should wait for the thread to finish before executing the codes after it, right? It was behaving differently on different occasions.

I have three cases to check if my code goes well

 - App is used for the first time - works as expected but the loading page don't appear while downloading
 - App is used the second time (db is up to date) - works okay
 - App is used the third time (db is outdated, must update) - won't update, screen blacks out, then crashes

I think I have problems with this code on `onCreate` method:

    dropOldSchedule();
    dropThread.join();
    triggerDownload();


Based on the logs, the code works until before this part... What can be the problem?

 ****
 **MainActivity.java**

<!-- language: java -->

    public class MainActivity extends Activity {
	
	final static int INDEX_ACCTTYPE = 0; 
	final static int INDEX_ECN = 1; 
	final static int INDEX_TLN = 2; 
	final static int INDEX_SIN = 3; 
	final static int INDEX_MOBILE = 4; 
	final static int INDEX_CITY = 5;
	final static int INDEX_START_DATE = 6;
	final static int INDEX_START_TIME = 7;
	final static int INDEX_END_DATE = 8; 
	final static int INDEX_END_TIME = 9; 
	final static int INDEX_REASON = 10;
	final static int INDEX_DETAILS = 11;
	
	DatabaseHandler db;
	String str;
	ProgressDialog pd;
	
    TextView homeText1, homeText2, homeText3, homeText4;
	
	final private String csvFile = "http://www.meralco.com.ph/pdf/pms/pms_test.csv";
	final private String uploadDateFile = "http://www.meralco.com.ph/pdf/pms/UploadDate_test.txt";
	
	Thread dropThread = new Thread(new Runnable() {
		
		public void run() {
			db = new DatabaseHandler(MainActivity.this);
			db.dropOldSchedule(); 
			
			runOnUiThread(new Runnable() {
				public void run() {
					while (!pd.isShowing());
					db.close();
					pd.dismiss();
				}
			});
		}
	
	});
	Thread getUploadDateThread = new Thread(new Runnable() {
		
		public void run() {
			
			try {
				URL myURL = new URL(uploadDateFile);
	
		        BufferedReader so = new BufferedReader(new InputStreamReader(myURL.openStream()));
		        while (true) {
		        	String output = so.readLine();
		        	if (output != null) {
		        		str = output;
		        	}
		        	else {
		        		break;
		        	}
		        }
			so.close();
			}
			catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} 
			
			runOnUiThread(new Runnable() {
				public void run() {
					while (!pd.isShowing());
					pd.dismiss();
				}
			});
		}
		
		});
	Thread downloadThread = new Thread(new Runnable() {
		
		public void run() {
						
			db = new DatabaseHandler(MainActivity.this);
	        db.beginTransaction();
	        
			try {
				URL url = new URL(csvFile);
				
				Log.i("dl", "start");
				
				InputStream input = url.openStream();
				CSVReader reader = new CSVReader(new InputStreamReader(input));
				Log.i("dl", "after reading");
				
				String [] sched;
			    while ((sched = reader.readNext()) != null) {
			    	if(sched[INDEX_CITY].equals("")) sched[INDEX_CITY]="OTHERS";
			    	try {
	        			
	        			db.addRow(sched[INDEX_SIN], sched[INDEX_CITY], 
		        				sched[INDEX_START_DATE], sched[INDEX_START_TIME], 
		        				sched[INDEX_END_DATE], sched[INDEX_END_TIME], 
		        				sched[INDEX_DETAILS], sched[INDEX_REASON]);
					} catch (IndexOutOfBoundsException e) {
						db.addRow(sched[INDEX_SIN], sched[INDEX_CITY], 
		        				sched[INDEX_START_DATE], sched[INDEX_START_TIME], 
		        				sched[INDEX_END_DATE], sched[INDEX_END_TIME], 
		        				"", sched[INDEX_REASON]);
						//e.printStackTrace();
					}
			    }
			    input.close();
			    Log.i("dl", "finished");
				
			} catch (MalformedURLException e) {
				e.printStackTrace();
				db.endTransaction();
			} catch (IOException e) {
				e.printStackTrace();
				db.endTransaction();
			} 
			Log.d("Count", ""+db.count());
			db.setTransactionSuccessful();
			db.endTransaction();
			
			writeUploadDateInTextFile();
			
		}
	
	});
	
	@SuppressWarnings("unqualified-field-access")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pms_main);
        
		Button home = (Button) findViewById(R.id.home);
		home.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, MeralcoSuite_TabletActivity.class);
				intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(intent);
				
				finish();
			}
		});
        
        homeText1 = (TextView) findViewById(R.id.home_text1);
		homeText2 = (TextView) findViewById(R.id.home_text2);
		homeText3 = (TextView) findViewById(R.id.home_text3);
		homeText4 = (TextView) findViewById(R.id.home_text4);
        
        homeText1.setVisibility(View.INVISIBLE);
        homeText2.setVisibility(View.INVISIBLE);
        homeText3.setVisibility(View.INVISIBLE);
        homeText4.setVisibility(View.INVISIBLE);
        
        getUploadDate();
        try {
			getUploadDateThread.join();		//wait for upload date
			
			Log.d("getUploadDate","thread died, upload date=" + str);
			
			if(dbExists()){
	        	db = new DatabaseHandler(MainActivity.this);
		        Log.d("Count", "" + db.count());
		        db.close();
		        
		        if(!uploadDateEqualsDateInFile()){
		        	dropOldSchedule();
		        		dropThread.join();
		        	triggerDownload();
		        }
	    		showDisclaimer();
		        Log.i("oncreate", "finished!");
		        return;
	        }
	       
	        triggerDownload();
	        showDisclaimer();
	        Log.i("oncreate", "finished!");

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
	}
	
	public void dropOldSchedule(){
		
		if(pd!=null && pd.isShowing())
			pd.setTitle("Getting upload date...");
		else
			pd = ProgressDialog.show(this, "Getting upload date", 
				"This may take a few minutes...", true, false);
		
		
		dropThread.start();
	}
	public void triggerDownload() {

		if (!checkInternet()) {
			showAlert("An internet connection is required to perform an update, please check that you are connected to the internet");
			return;
		}

		if(pd!=null && pd.isShowing())
			pd.setTitle("Getting upload date...");
		else
			pd = ProgressDialog.show(this, "Getting upload date", 
				"This may take a few minutes...", true, false);
		
		downloadThread.start();

	}

	public void getUploadDate() {
		
		Log.d("getUploadDate", "getting upload date of schedule");
		
		if(pd!=null && pd.isShowing())
			pd.setTitle("Getting upload date...");
		else
			pd = ProgressDialog.show(this, "Getting upload date", 
				"This may take a few minutes...", true, false);
	

		getUploadDateThread.start();

	}
	
	public void writeUploadDateInTextFile() {
		Log.d("writeUploadDateTextFile", "writing:"+str);
		
		try {
			OutputStreamWriter out = new OutputStreamWriter(openFileOutput(
					"update.txt", 0));
			out.write(str);
			out.close();
		} catch (java.io.IOException e) {
			e.printStackTrace();
		}
	}
	
	public void showDisclaimer() {
		Log.d("ShowDisclaimer", "showing disclaimer");

		homeText3
		.setText("..." + str
				+ "...");
		
		
		homeText1.setVisibility(View.VISIBLE);
		homeText2.setVisibility(View.VISIBLE);
		homeText3.setVisibility(View.VISIBLE);
		homeText4.setVisibility(View.VISIBLE);
		
		Log.d("showDisclaimer", "finished showing disclaimer");

	}
	
	public boolean uploadDateEqualsDateInFile() {
		Log.d("uploadDateEqualsDateInFile","comparing schedule upload dates");
		
		try {
				String recordedDate = "";
				InputStream instream = openFileInput("update.txt");
				if (instream != null) {	// if file the available for reading
					Log.d("uploadDateEqualsDateInFile","update.txt found!");
					
					InputStreamReader inputreader = new InputStreamReader(instream);
					BufferedReader buffreader = new BufferedReader(inputreader);
					
					String line = null;
					while ((line = buffreader.readLine()) != null) {
						recordedDate = line;
						Log.d("uploadDateEqualsDateInFile","recorded:"+recordedDate);
					}
					
					Log.d("uploadDateEqualsDateInFile","last upload date: " + str + ", recorded:" +recordedDate);
					
					if(str.equals(recordedDate)) return true;
					return false;
				}
				Log.d("uploadDateEqualsDateInFile","update.txt is null!");
				return false;	
				
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public boolean checkInternet() {
		ConnectivityManager cm = (ConnectivityManager) this
				.getSystemService(Context.CONNECTIVITY_SERVICE);

		NetworkInfo infos[] = cm.getAllNetworkInfo();

		for (NetworkInfo info : infos)
			if (info.getState() == NetworkInfo.State.CONNECTED
					|| info.getState() == NetworkInfo.State.CONNECTING) {
				return true;
			}

		return false;
	}

	public boolean dbExists() {
		
		File database=getApplicationContext().getDatabasePath(DatabaseHandler.DATABASE_NAME);

        if (!database.exists()) {
            Log.i("Database", "Not Found");
            return false;
        }
        
		Log.i("Database", "Found");
        return true;
		
	}
	
	@Override
	protected void onDestroy() {
	    super.onDestroy();
	    if (db != null) {
	        db.close();
	    }
	}
	@Override
	protected void onPause() {
		super.onPause();
		if (db != null) {
			db.close();
		}
	}
}