PDA

View Full Version : مشکل در کار با thread



mehdi.safavie
سه شنبه 28 مهر 1394, 15:30 عصر
درود;

دوستان یه برنامه نوشتم که به SQL روی هاست وصل میشه و عملیات های Insert , Update , Delete و Show رو انجام میده .
تو 3 قسمت اول مشکلی نیست ولی برای این که اطلاعات رو در ListView نمایش بده یه مشکلی هست .

تو کلاس مربوط به Database یه متد گذاشتم که تمام اطلاعات رو از سرور SELECT میکنه .
* نکته : برای این که از سرور یه صورت اینترنتی اطلاعات رو دریافت کنیم حتما باید کد هاش رو داخل یک Thread یا BackGround بنویسیم ( که من هنوز نتونستم با @BackGround کار کنم )
خب متد من به این شکله :
زمانی که متد فراخوانی میشه اول Thread استارت میشه و در خط بعد اطلاعات داخل یک Araye برگردانده میشه . داخل Thread هم اون Araye من پر میشه .
ولی زمانی که Thread میخواد با دیتابیس ارتباط برقرار کنه مدت زمانی طول میکشه ، بعد از اتصال هم تازه میاد Araye رو پر میکنه .
این در صورتیه که قبل از این که Araye در داخل Thread پر بشه تو متد من یه Araye خالی برگردونده شده .

اگر گیج کننده بود توضیحام ، کدش رو میزارم دوباره توضیح میدم ، اگر هم که نه نیازی نیست این توضیح دوباره رو بخونین ، ممنون :


List<Data_Member> contacts = new ArrayList<Data_Member>();
String SQL_Queryy, Error_Messagee;
boolean Show_Messagee;


public List<Data_Member> get_All_Members_SQLExPRESS() {


thread2.start();


return contacts;
}


Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
try {
Log.i("Android", " MySQL Connect Example.");
Connection conn = null;
String driver = "net.sourceforge.jtds.jdbc.Driver";
Class.forName(driver).newInstance();
//test = com.microsoft.sqlserver.jdbc.SQLServerDriver.class ;
String connString = "jdbc:jtds:sqlserver://xx.xx.xx.xx:1433/xxDatabasexx;encrypt=fasle;user=xxxxxxxxxx;passwor d=xxxxxxxxxx;instance=SQLEXPRESS;";
String username = "xxxxxxxxxx";
String password = "xxxxxxxxxx";
conn = DriverManager.getConnection(connString, username, password);
Log.w("Connection", "open");
Statement stmt = conn.createStatement();
ResultSet reset = stmt.executeQuery("SELECT * FROM TB_Sabt");


// Print the data to the console
while (reset.next()) {
Log.w("Data:", reset.getString(3));
//Log.w("Data",reset.getString(2));
Data_Member member = new Data_Member();


member.set_FieldID(reset.getLong(1));
member.set_Field1(reset.getString(3));
member.setFIeld2(reset.getString(4));
member.setField3(reset.getString(5));
contacts.add(member);
}
conn.close();
Show_Messagee = true;
MA.refreshList();
}
catch (Exception ex)
{
Show_Messagee = false;
if(Show_Messagee == false)
{
Error_Messagee = ex.toString();
}
}
}
});


ببینید ، اول Thread استارت شده بعد return شده .
قبل از این که Thread بیاد contacts رو پر کنه ، یه contacts خالی برگردونده میشه . بعد که Thread کارش تموم میشه و contacts پر میشه دیگه کار از کار گذشته و فایده نداره .

برای این مشکل باید چه راه حلی بزارم ؟

mehdi.safavie
سه شنبه 28 مهر 1394, 21:12 عصر
آیا منطقیه برای این که این مشکل به وجود نیاد یه Loading به صفحه ورود برنامه اضافه کنم تا اول اطلاعات رو از دیتابیس بگیره بعد صفحه اصلی برنامه بالا بیاد ؟
یا ، پس نرم افزارایی مثل بازار یا دیوار چطور کار میکنن ؟ آیا هر چند وقت به چند وقت به روز رسانی میشن یا راه حلی دیگه ای میرن ؟