Добрый день уважаемые!! =) Очень рад вас всех видеть. Радостно глазу, что люди занимаются полезным делом, а не тратят впустую...
Мне нужна ваша помощь. На данном этапе, я хочу реализовать подключение к БД MySQL( да, я вам писал =) и подключился, но проблема теперь в другом немного =) ), через другой класс, а не в мейне, ибо не люблю когда сильно много напихано в мэйн.
Вы знаете, что начиная с энной версии андроида, в мейн потоке нельзя выполнить подключение к БД, для этого нужно будет создать вспомогательный поток и выполнить все там(спасибо rezak90). Вот что у меня написано в мейне:
Код: Выделить всё
public class AndroidMySQLClient extends Activity{
TextView tvTOP, tvRoomsAreFree, tvTime;
Button btnBooking;
My_AsynchTask_Executable mt;
Animation anim = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radisson_blu_main_page);
tvTime = (TextView) findViewById (R.id.tvTime);
tvTOP = (TextView) findViewById(R.id.tvTOP);
tvRoomsAreFree = (TextView) findViewById (R.id.tvRoomsAreFree);
btnBooking = (Button) findViewById (R.id.btnBooking);
TodayDate(); AnimComponent();
mt = new My_AsynchTask_Executable();
mt.doInBackground();
mt.onPostExecute(null);
tvRoomsAreFree.setText(mt.FreeRooms);
}
Мой класс вспомогательного потока:
Код: Выделить всё
public class My_AsynchTask_Executable extends AsyncTask<Void, Void, Void> {
MySQL mysql;
String Logs = "";
int FreeRooms;
public void onPreExecute() {
super.onPreExecute();
Logs = Logs + "Begin AsynchTask \n";
}
public Void doInBackground(Void... params) {
mysql = new MySQL();
try {
FreeRooms = mysql.db_Query();
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
public void onPostExecute(Void result) {
super.onPostExecute(result);
Logs = Logs +"doInBackground done! /n";
//FreeRooms = mysql.db_Query();
}
}
И наконец мой класс самого подключения:
Код: Выделить всё
public class MySQL {
//My database values
Connection SQLConnection = null;
Statement st = null;
ResultSet rs = null;
int countBusyRooms = 0;
int countFreeRooms = 0;
String [] TableName = {"radisson_blue", "radisson_clients", "radisson_booking"};
String DatabaseAddr = "jdbc:mysql://192.168.0.101:3306/hotel",
DatabaseLogin = "Client",
DatabasePass = "130393",
sql_query = "SELECT radisson_blu.Flat FROM radisson_booking INNER JOIN radisson_blu ON radisson_booking.Flat = radisson_blu.Flat";
String ResultView = "", Logs = "";
//DB_QUERY START
public int db_Query () {
try{ Class.forName("com.mysql.jdbc.Driver").newInstance();
SQLConnection = DriverManager.getConnection(DatabaseAddr,DatabaseLogin,DatabasePass); //Connection to my DataBase
} catch(Exception e) { Logs = "Operation Fail. Database not include \n";
} try {
st = SQLConnection.createStatement(); //Create statement
rs = st.executeQuery(sql_query); //Execute Query
while (rs.next()) {countBusyRooms += 1;} //Query`s result
Logs = "Operation success! \n";
sql_query = "SELECT radisson_blu.Flat FROM radisson_blu";
rs = st.executeQuery(sql_query); //Execute Query
while (rs.next()) {countFreeRooms += 1;} //Query`s result
} catch(Exception e){ Logs = "Operation Fail: \n" + e; }
countFreeRooms = countFreeRooms - countBusyRooms;
return countFreeRooms;
}
//DB_QUERY END
}
За код можете ругать, принимаю ВСЮ критику. Очень хочу научится писать правильно и понятно.
Проблема еще в доп. потоке... Я его прописал в методе onCreate, но командой mt.execute(), выполняется лишь метод onPreExecute, а другие два (doInBackground; onPostExecute) не выполняются. Может нежелательно писать в onCreate?
А иногда выбивает ошибку в MySQL - классе, в методе db_Query(), во втором try, nullPointerException, вроде бы так...на строке st = SQLConnection.createStatement();.
Очень странно еще то, что на эмуляторе(2.3.3 версии андроида), работает все то, что я выше описал и ошибок нет, но когда подключил аппарат (4.0.4 версии), сразу началась такая суматоха.
Поделитесь мыслями пожалуйста. =) Что я делаю не так? Вот особенно вопрос волнует самого Task, почему те два метода у меня не выполняются?
Спасибо за внимание.