如何暂停主u.i线程(Android)

时间:2016-11-08 18:37:27

标签: java android multithreading user-interface

我不知道这是否是这个问题的合适标题,但它是这样的。

我正在我的主要u.i线程上运行一个for循环,长度大约是1000.那是相当多的,我不应该在AsyncTask中做那件事,因为它需要很长时间才能冻结应用程序?是的,我知道,但它在主要线程上做的重要。

 for (int i = 0; i < 3000; i++){ 
      // do stuff
  }

问题出现了

我在UI上有一个textview,我想在循环达到一定数量时设置它的值。但由于它与已经运行的循环竞争,它将在循环周期完成后才会运行。

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

    if(i = 400) {

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

 }

我的问题是,如何在同一个线程上暂停循环,更新textview并继续循环。我已经尝试过没有结果的Thread.yield()。任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

创建一个IntentService,在onHandleIntent中运行您的循环,当您到达某个号码时使用sendBroadcast到您的活动,并在onReceive更新textView 1}}。

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