2016-11-08 79 views
-1

我不知道這是否是這個問題的適當標題,但它是這樣的。如何暫停主u.i線程(Android)

我正在我的主要u.i線程上運行for循環,長度約爲1000.這就好多了,我不應該在AsyncTask或其他東西中這樣做,因爲它需要很長時間並可能會凍結應用程序?是的,我知道,但重要的是我在主線上做的。

這裏談到的問題

我有,我想,當循環達到一定數量將其值設置的UI一個TextView。但是由於它與已經運行的循環競爭,所以直到循環完成後纔會運行。

for (int i = 0; i < 3000; i++){ 

    if(i = 400) { 

     textView.setText('blah ' + i); 
    } 

} 

我的問題是,我如何暫停循環,更新textview並繼續循環,而在同一個線程。我試過沒有結果的Thread.yield()。任何建議,將不勝感激

+0

「是的,我知道,但它的重要我做的主線」:你能解釋爲什麼嗎?你正確地確定了這個問題,在主線程上做很多工作並不是一個好主意。 – Henry

+0

恐怕這是不可能的,因爲一個線程以線性方式執行代碼,而Java沒有'goto'。我看到了一些選項,比如在'for'語句中使用'break',更新UI並再次執行另一個'for',或者正確使用其他線程來並行化'for'循環並更新UI – nandsito

+0

@Henry我不'不介意應用程序凍結,我更喜歡在循環運行時可以做任何事情。現在我想能夠暫停我的主線程,然後setTextview並繼續循環。 –

回答

0

創建IntentService,那裏onHandleIntent運行循環,當您到達一定數目的使用sendBroadcast到您的活動,並在onReceive更新textView

public class MyService extends IntentService { 
    public MyService() { 
     super("MyService"); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     for (int i = 0; i < 3000; i++){ 
      if(i == 400) { 
       sendBroadcast(new Intent("com.example.android.myApp.SOME_KEY")); 
      } 
     } 
    } 
} 

在您的MainActivity,onCreate

registerReceiver(broadcastReceiver, new IntentFilter("com.example.android.myApp.SOME_KEY")); 

外的onCreate

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     textView.setText("great"); 
    } 
}; 

不要忘記將Service添加到Manifest

+0

請舉例嗎? –

+0

我編輯了我的答案。 –

+0

謝謝你會嘗試和恢復 –