Мне нужно проверить переменную для изменения, если произойдет изменение, я обновлю текстовое представление.Активность android создать несколько экземпляров моего потока
поэтому я создал новую цепочку с петлей while для этой цели. i проверять переменную каждые 1 секунду, через Thread.sleep()
этот поток создан и запущен в onCreate(). так что это один раз.
Проблема заключается в том, что каждый раз, когда я переворачиваю свой телефон (от вертикали до горизонтали или ...), создается новый поток.
вот мой код:
public class HomeActivity extends Activity
{
private final static int LOAD_SUCCESSFULL = 1;
private final long LOCATION_THREAD_SLEEP = 1000;
private boolean flag = false;
static TextView lat;
static TextView lon;
static Location currentLocation = null;
Thread locationThread;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.new_home2);
this.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.new_home_titlebar);
lat = (TextView)findViewById(R.id.t2rt3);
lon = (TextView)findViewById(R.id.t2rt4);
/* FindLocation class is a helper class that find location via simcard or gps in separate thread,
same problem happen with this thread also, it create multiple thread, for ease of work i
commented this part.
*/
//FindLocation fn = new FindLocation(this);
locationThread = new Thread(null, loadLocation, "loadLocationHomePage");
locationUpdater();
}
private static Handler locationUpdateHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch(msg.what)
{
case LOAD_SUCCESSFULL:
lat.setText(Double.toString(currentLocation.getLatitude()));
lon.setText(Double.toString(currentLocation.getLongitude()));
//stopThread();
break;
}
}
};
private Runnable loadLocation = new Runnable()
{
public void run()
{
//boolean flag = false;
while(!flag)
{
if(Data.currLocation != null)
{
currentLocation = new Location(Data.currLocation);
Message msg = locationUpdateHandler.obtainMessage(LOAD_SUCCESSFULL);
locationUpdateHandler.sendMessage(msg);
//return;
flag = true;
//return;
}
else
{
try
{
Thread.sleep(LOCATION_THREAD_SLEEP);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};
public void locationUpdater()
{
//Thread locationThread = new Thread(null, loadLocation, "loadLocationHomePage");
locationThread.start();
}
так, как я могу решить эту проблему?
Я думаю, что более полезно попытаться объяснить, что вы пытаетесь сделать. Кажется, что вы обновляете глобальную статическую переменную (currentLocation) в другом месте и хотите прочитать это в этой операции. Вместо использования потоков кажется, что вы должны использовать какой-то механизм, чтобы слушатели знали, что новое место будет готово к употреблению. – dmon
@dmon: ok, вы правы, я обновляю статический объект местоположения через класс FindLocation (читайте комментарий в oncreate).то каждый раз, когда обновляется местоположение, я хочу обновить 2 textView (для широты и долготы), поэтому я создал этот поток, чтобы проверить наличие переменных местоположения. – mehdok
@dmon: я не могу найти какой-либо механизм для этого для textview, для listView вы можете сделать это, уведомив() (или что-то вроде этого, я не помню), но для текстового представления нет ничего подобного, так что я делаю это, в любом случае механизм не имеет значения, дело в том, что эта проблема не должна произойти вообще. – mehdok