我需要检查变量是否有变化,如果发生变化,我将更新文本视图。
所以我为此创建了一个带有while循环的新线程。我通过Thread.sleep()
每1秒检查一次变量此线程在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();
}
所以我怎么解决这个问题?
答案 0 :(得分:1)
实际上问题在于,每次你翻转手机都会创建Activity
的新实例,因此你在每次轮换时都会在onCreate()
上接到一个电话,你盲目地创建一个新{ {1}}并开始新的Thread
。
这是每个Thread
的默认行为,但我们可以通过在活动的Activity
文件中声明属性来更改此活动的重新创建
AndroidManifest
这样可以防止在方向更改时创建活动。
如果<activity
android:name="yourPackage.ActivityName"
android:configChanges="keyboardHidden|orientation|screenSize"
</activity>
override
希望这可以解决这个问题,而不会实现在某些其他用例中可能出现的复杂逻辑。
答案 1 :(得分:0)
我认为你不可能以最有效的方式解决这个问题。
但如果您的问题很简单,我如何防止产生多个工作线程,您应该查看无UI片段。
http://www.vogella.com/articles/AndroidFragments/article.html#headlessfragments1
答案 2 :(得分:0)
我不知道为什么android会这样做。如果我把我的代码放在onResume()中,那么这种行为就会产生,但就我而言,我不知道。
无论如何,我发现了一个肮脏的解决方案。我的想法是找到所有线程的列表并搜索它们,如果它存在则阻止创建另一个线程。public boolean checkThreadExist()
{
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
for(int i = 0; i < threadArray.length ; i++)
{
if(threadArray[i].getName().equalsIgnoreCase("loadLocationHomePage"))
return true;
}
return false;
}
更新onCreate():
if(checkThreadExist())
{
}
else
{
locationThread = new Thread(null, loadLocation, "loadLocationHomePage");
locationUpdater();
}