ست کردن فیلد ( استرینگ ) در اکتیویتی از کاستوم ترد
سلام
چطوري ميشه از يک کلاس کاستوم ترد در قسمت HANDLER ( که مثلا txtTest.setText میکنیم ) یک فیلد استرینگ در کلاس اکتیویتی رو که این کاستوم ترد رو صدا میزنه ست کنیم ؟
لطفا راهنمایی کنید . تشکر
دوست عزیز کاش یکم واض تر توضیح میدادی ولی اگه منظورت ست کردن یه string از یه کلاس دیگه به یه textview از درون یه thread و handler ه ، به این شکل میتونی انجام بدی:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
G.handler.post(new Runnable() {
@Override
public void run() {
///////////////////
myTextxView.setText(G.myString);
}
});
}
});
thread.start();
ببینید یک کاستوم ترد داریم به این صورت
public class CustomThread extends Thread {
public String str;
public void setStr(String value) {
str = value;
}
@Override
public void run() {
super.run();
G.HANDLER.post(new Runnable() {
@Override
public void run() {
if (getRandomBoolean()) {
//getRandomBoolean yek true false mide !
str = "right";
} else {
str = "left";
}
}
});
}
}
یک اکتیویتی هم داریم که از این کاستوم ترد استفاده میکنه به این شکل :
public class TestActivity extends Activity {
String str;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
CustomThread thread = new CustomThread();
thread.setStr(str);
thread.start();
Log.i("LOG", "" + str);
}
});
}
}
این null بر میگردونه در صورتی که باید right یا left بر گردونه .
این طوری :
public class CustomThread extends Thread {
public static String str;
public void setStr(String value) {
str = value;
}
public String getter() {
return str;
}
@Override
public void run() {
super.run();
G.HANDLER.post(new Runnable() {
@Override
public void run() {
if (getRandomBoolean()) {
//getRandomBoolean yek true false mide !
str = "right";
} else {
str = "left";
}
}
});
}
}
public class TestActivity extends Activity {
String str=20;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
CustomThread thread = new CustomThread();
thread.setStr(str);
thread.start();
str=getter();
Log.i("LOG", "" + str);
}
});
}
}
ویرایش:
این کد هم درست کار نمیکنه و دلیلش اینه که شما داری کدهای تعیین right و left رو توی یه thread اجرا میکنی و مشخصه که thread دوم موازی با main thread اجرا میشه و زمانی که داره برای شما getter رو اجرا میکنه ، هنوز اون right و left تعیین نشده ، پس مقدار str اولیه که بهش set کردید رو برمیگردونه و چون اون هم nullه به شما null میده (که من مقدارش رو مثلا 20 گذاشتم ). حالا شما اون setter رو انجام نده میبینی که کلیک اول کار نمیکنه (همون چیزی که spirit اشاره کرد ) ولی کلیک های بعدی کار میکنه چون متغییرمون استاتیکه
شما از AsyncTask استفاده کن
و توی اکتیویتی اینجوری تعیین کن
public static String str;
فیلد استرینگ تی ترد رو با نام strTest(صرفا به عنوان مثال) در AsynkTast تعریف کن و در متد onPostExecute در کلاس AsyncTask این رو بده
TestActivity.str = strText;
اگر هم می خوایی به تکستویو مقدار بدی توی اکتیویتی یک متد استاتیک ایجاد کن که به تکست ویو مقدار بده و توی onPostExecute صداش بزن
به این شکل:
public static void testing(String inputString){
txt1.setText(inputString);
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .