بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ست کردن فیلد ( استرینگ ) در اکتیویتی از کاستوم ترد

مدیریت گفتگو
Erfan 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام
چطوري ميشه از يک کلاس کاستوم ترد در قسمت HANDLER ( که مثلا txtTest.setText میکنیم )  یک فیلد استرینگ در کلاس اکتیویتی رو که این کاستوم ترد رو صدا میزنه ست کنیم ؟

لطفا راهنمایی کنید . تشکر

نظرات

پاسخ‌ها 4

sadeghbarout 12 سال پیش

دوست عزیز کاش یکم واض تر توضیح میدادی ولی اگه منظورت ست کردن یه 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();

نظرات

Erfan 12 سال پیش

ببینید یک کاستوم ترد داریم به این صورت

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 بر گردونه .

نظرات

sadeghbarout 12 سال پیش
خب معلومه، شما Str رو اصلا مقدار دهی نکردی داخل TestActivity
Erfan 12 سال پیش
خوب میخوام از کاستوم ترد ست بشه دیگه !
sadeghbarout 12 سال پیش
اینجوری که ست نمیشه. اون str که داخل کاستوم ترد گذاشتی فقط هم اسمشه و هییییییییچ ربطی به این str که توی testActivity تعریف کردی نداره. شما یه متد getter داخل CustomThread ت بذار و مقدار str رو از اونجا بگیر
Erfan 12 سال پیش
خوب من هم میدونم هییییییییچ ربطی نداره ولی با اون thread.setStr(str); همونطور که استاد توی ویدیو ها TextView ها رو به کاستوم ترد وصل کردن منم امدم استرینگ هارو وصل کردم ولی در TextView ها ما setTextView میکردیم اما استرینگ رو فقط مساوی کردم
sadeghbarout 12 سال پیش

این طوری :

 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  اشاره کرد ) ولی کلیک های بعدی کار میکنه چون متغییرمون استاتیکه

 

 

نظرات

Erfan 12 سال پیش
این کار هم قبلا کرده بودم بازم هم null بر میگرده :(
Spirit 12 سال پیش
من تست کردم ، کار میکنه ، برای str یه مقدار پیشفرض تو خود کلاس Thread دادم ، فقط یبار نمیدونم چجوری شد مقدار دهی جدید انجام نشد ولی تو کلیک های بعدی درست کار کرد!
Erfan 12 سال پیش
یعنی متد run در HANDLER اجرا شد ؟ و right و left هر بار ریخته شد در str ؟!!!!!
sadeghbarout 12 سال پیش
خب شما داری ترد استفاده میکنی . پاسخ ویرایش شد!
hoseinnrz 12 سال پیش
آقا منم به همین مشکل خوردم ، سوالی که از شما دارم اینه که : با این توضیحات داده شده ، برای اینکه با اولین اجرا بتونم حاصل متغیر استاتیکُ دریافت کنم چیه ؟
sadeghbarout 12 سال پیش
اصولیش اینه که باید یه listener تعریف کرد و عمل getter رو توی اون لیسنر انجام داد
hoseinnrz 12 سال پیش
@sadeghhbarout : میشه یه مثال بزنی لطفا به صورت کد باشه ، و اینکه این لیسنر باید کجا تعریف بشه و تو چه قسمتی ، ممنون میشم اگه واسه توضیحات یه نمونه کد یا مثال بزنی
sadeghbarout 12 سال پیش
متاسفانه الان فرصتشو ندارم کد بذارم. آموزش بخش interface ها رو مطالعه کن یا آموزش ساخت Webservice که جدید استاد ضبط کرده. توی اونا نحوه تعریف و کار با لیسنر گفته شده
Hossein Kurd 12 سال پیش

شما از AsyncTask استفاده کن

و توی اکتیویتی اینجوری تعیین کن

public static String str;

فیلد استرینگ تی ترد رو با نام strTest(صرفا به عنوان مثال) در AsynkTast تعریف کن و در متد onPostExecute در کلاس AsyncTask این رو بده

TestActivity.str = strText;

اگر هم می خوایی به تکستویو مقدار بدی توی اکتیویتی یک متد استاتیک ایجاد کن که به تکست ویو مقدار بده و توی onPostExecute صداش بزن

به این شکل:

     public static void testing(String inputString){
        txt1.setText(inputString);
    }

نظرات

Hossein Kurd 12 سال پیش
اگر مشکلت حل شد بگو

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .