我不知道这是否是这个问题的合适标题,但它是这样的。
我正在我的主要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()。任何建议将不胜感激
答案 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
。