0

我需要检查变量是否更改,如果发生更改,我将更新文本视图。

所以我为此目的创建了一个带有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();
}

那么我该如何解决呢?

在此处输入图像描述

4

3 回答 3

1

实际上问题是每次你翻转手机Activity都会创建一个新实例,因此你在每次旋转时都会接到一个电话onCreate(),告诉你在哪里盲目地创建一个新的Thread并开始新的Thread

这是每个人的默认行为,但我们可以通过在文件中为 ActivityActivity声明一个属性来更改 Activity 的重新创建AndroidManifest

<activity
    android:name="yourPackage.ActivityName"
    android:configChanges="keyboardHidden|orientation|screenSize"
</activity>

这将防止在方向更改时创建 Activity。

您还将获得这些定向活动,如果您override

@Override
        public void onConfigurationChanged(Configuration newConfig) {}

希望这将解决这个问题,而无需实现在其他一些用例中可能会破坏的如此复杂的逻辑。

于 2013-09-15T08:56:21.147 回答
0

我认为您可能没有以最有效的方式解决此问题。

但是,如果您的问题很简单,我如何防止产生多个工作线程,您应该查看一个 UIless 片段。

http://www.vogella.com/articles/AndroidFragments/article.html#headlessfragments1

于 2013-09-15T06:54:09.207 回答
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();            
    }
于 2013-09-15T08:29:16.733 回答