سلام
من کدی به شکل زیر دارم و باید مقدار متغیر string_from_sp را در هر چند ثانیه بگیرم و در یک textview نمایش دهم.
کد پیاچپی:
int delay = 500;
int period = 1000;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask()
{
String string_from_sp;
@Override
public void run() {
SharedPreferences shared = getSharedPreferences("Prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
string_from_sp = shared.getString("str", "");
} }, delay, period);
textview.setText(string_from_sp);
اما متغیر string_from_sp تنها در تابع timer شناخته شده است. چگونه میتوان کاری کرد تا مقدار string_from_sp در خارج نیز شناخته شده و قابل استفاده باشد؟
من دقیق متوجه نشدم.. شما خب یک تایمر دارید و که بوسیله sharedPreferences یه رشته رو بر میگردونه و داخل string_from_sb ذخیره میکنه...خب این متد مشکلی که نداره ..اینکه میخواید رشته بیرون از بدنه قابل دسترسی باشه..کافیه رشته رو بیرون از بدنه تایمر و در کلاس اصلی تعریف کنید..پس کافیه عبارت زیر رو از داخل بدنه پاک کنید و داخل کلاستون تعریف کنید.
نمیدونم سوالتون همین بود یا من بد متوجه شدم
هنگامی که رشته را در کلاس اصلی تعریف میکنم مقداری متفاوت (null) نمایش داده میشود. اما من میخواهم این مقدار از SharedPreferences هر چند ثانیه گرفته شود به صورتی که بشود در خارج از timer روی آن پردازش انجام داد. در واقع مقدار جدید که در هر چند ثانیه بروز میشود تنها درون timer قابل استفاده است.
سلام.
براتون مثال می زنم :
کد پیاچپی:
package com.kelidestan.com;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClass myClass = new MyClass();
String newString = myClass.myString;
Toast.makeText(getApplicationContext(), newString, Toast.LENGTH_SHORT).show();
}
public class MyClass {
String myString = "www.kelidestan.com";
}
}
کدهای تعریف کلاس به صورت زیر می باشد :
کد پیاچپی:
public class MyClass {
String myString = "www.kelidestan.com";
}
.
بعد در کدهای روش onCreate ، کدهای زیر را نوشته ایم :
کد پیاچپی:
MyClass myClass = new MyClass();
String newString = myClass.myString;
Toast.makeText(getApplicationContext(), newString, Toast.LENGTH_SHORT).show();
که در آن، با خط زیر، یک شیء (object) از کلاس MyClass ساخته شده :
کد پیاچپی:
MyClass myClass = new MyClass();
و بعد خط زیر را داریم که در آن، به مقدار myString دسترسی داریم :
کد پیاچپی:
String newString = myClass.myString;
-------------------------------------------------
همچنین دقت داشته باشید که مواردی که با SharedPreferences ذخیره شده اند، با همان روش های فراخوانی SharedPreferences ، در هر بخشی از برنامه اندروید، قابل فراخوانی می باشند. یعنی جدا از مثال بالا، شما می توانید مقدار ذخیره شده با SharedPreferences را در هر جایی فراخوانی کنید (بنابراین مقدار جدید را ذخیره کرده و بعد در هر جایی که خواستید، فراخوانی می کنید).
تازه منظور شما رو فهمیدم ..شما مشکلتون اینه که درسته تایمر صدا زده میشه و مقادیر عوض میشه ولی مقدار textView مقدار null چاپ میکند درسته؟
خب شما به یک نکته توجه نکردید...زمانی که اکتیویتی اجرا میشود..متد oncreate یکبار صدا زده میشود ..توجه کنید یک بار...و وقتی که صدا زده میشود..object تکست ویو ساخته میشود و دستور زیر شما اجرا میشود..
کد پیاچپی:
textview.setText(string_from_sp);
و وقتی اجرا میشود مقدار null رو چاپ میکند....چون هنوز مقدار دهی نشده...ولی وقتی متد تایمر صدا زده میشود مقدار string_from_sp عوض میشود هر چند لحظه ..ولی چون دستور بالا داخل بدنه oncreate ساخته شده..و یکبار فقط صدا زده شده...دیگه صدا زده نمیشود و همان مقدار قبلی نمایش داده میشود...در واقع مقدار متغییر هر لحظه تغییر میکند ولی دستور
کد پیاچپی:
textview.setText(string_from_sp);
یکبار اجرا میشود بخاطر همین شما فکر میکنید مقدار متغییر تغییر نمیکند..درحالی که تغییر میکند ....
امیدوارم متوجه شده باشید...پس تمامی کارایی که میخواید روی متغییر هر چند لحظه انجام بشن داخل یک متد مثلا
کد پیاچپی:
public void working_on_string()
{
textview.setText(string_from_sp);
//کارایی که باید انجام بدید.
}
بعد این متد رو داخل متد تایمر صدا بزنید...
امیدوارم جوابتون کامل گرفته باشید.