2017-07-03 61 views
0

我想更新活動中的TextView,更新視圖的方法是在主要活動(正常情況),但調用此方法是從另一個類(和另一個類線)。android視圖沒有從另一個類和另一個線程更新

這是更新視圖的方法,該方法是在主要活性, (請注意,所有的日誌被正確地打印,並以正確的順序):

public void getDataFromFiles() { 
    String new_text = JsonReader.readTextData(dataName,activityName, this); 
    Log.i("Loading", "loaded text " + new_text ); 
    if (new_text != null) { 
     TextView introText = (TextView) findViewById(R.id.loading_introTxt); 
     introText.setText(new_text); 
    } 

} 

這是它是從所謂的LoadingThread另一個類調用,它具有一定的參考(loadingActivity):

  activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Log.i("LoadingThread", "Will update loading screen"); 
       loadingActivity.getDataFromFiles(); 

      } 
     }); 

還要注意如何LoadingThread類是從主要活動稱爲

LoadingThread loadingThread = LoadingThread.getInstance(this); 
    Thread thread = new Thread(loadingThread); 
    loadingThread.setActivity(this); 
    thread.start(); 

所以這樣的流程: 主要活動開始,然後後調用一次的主要活動這是爲了更新視圖的方法的LoadingThread,但這種情況不會發生,但在關閉應用程序時和再次打開它,那麼更新就在那裏。

+0

您正在UI線程上運行更新,所以這不是問題。嘗試添加introText.invalidate();在getDataFromFiles()中設置文本後。 – Juan

+0

您可以嘗試在活動中保留loading_introTxt的引用並查看它是否有幫助? –

+0

@juan不,它不工作,不幸的 – yoyo

回答

0

我發現這個問題,它是在

LoadingThread loadingThread = LoadingThread.getInstance(this); 
Thread thread = new Thread(loadingThread); 
loadingThread.setActivity(this); 

而getInstance()方法:

if (instance == null) { 
     instance = new LoadingThread(); 
     instance.loadingActivity = loadingActivity; 

    } 
    return instance; 

關閉並重新打開應用程序時,該實例是不是空,因此返回以前的活動,其不在這裏了,因爲加載活動的參考沒有更新,所以我改變了它,所以我改變了這樣的

if (instance == null) { 
     instance = new LoadingThread(); 
    } 
    instance.loadingActivity = loadingActivity; 
    return instance; 

現在它工作!