Android 在活动继续之前完成线程操作
这是我项目中的一段代码,我需要这个线程一直结束,然后转到最后一个Log.i()并完成函数Android 在活动继续之前完成线程操作,android,Android,这是我项目中的一段代码,我需要这个线程一直结束,然后转到最后一个Log.i()并完成函数 public void delay3Seconds(final String txt1, final String txt2, final String s, final Intent i) { //keepMoving= false; counter= 3; secondsBool= true; if(!errorMonitor)
public void delay3Seconds(final String txt1, final String txt2, final String s, final Intent i)
{
//keepMoving= false;
counter= 3;
secondsBool= true;
if(!errorMonitor)
{
Log.i("Main.delay3Seconds()", s+" in 3 seconds");
new Thread()
{
public void run()
{
while(secondsBool)
{
try {
Thread.sleep(1500);
}
catch (InterruptedException e){e.printStackTrace();}
if(!errorMonitor)
{
handler.post(new Runnable()
{
public void run()
{
final DialogFragment loadDF= new RecDialog(MainActivity.this, txt1, txt2, s+(counter--)+" שניות", null, false, true, ll.getWidth(), ll.getHeight());
loadDF.show(getSupportFragmentManager(), "RecDialog");
dialog.dismiss();
dialog= loadDF;
if(counter == 0)
secondsBool= false;
}
});
}
else
secondsBool= false;
}
if(!errorMonitor)
{
handler.post(new Runnable()
{
public void run()
{
dialog.dismiss();
if (i.resolveActivity(getPackageManager()) != null)
{
Log.i("Main.delay3Seconds()", "resolveActivity != null");
setResolveNotFail(true);
Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
startActivity(i);
}
else
{
Log.i("Main.delay3Seconds()", "resolveActivity == null");
setResolveNotFail(false);
Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
}
}
});
}
}
}.start();
}
Log.i("Main.delay3Seconds()", "(end) resolveNotFail = "+resolveNotFail);
}
我不知道该怎么做。我尝试使用synchronized(),但我可能用错了,因为函数首先完成自身,然后线程才能与活动同时工作
如果您能给我一些建议,我将不胜感激。这绝对不是您使用线程的方式或原因。首先,如果这是UI线程,你不应该暂停它3秒钟。第二,线程的整个点是并行工作的。您永远不希望一个线程暂停并等待另一个线程。如果您需要线程A上的某些内容仅在线程B完成时发生,那么在线程B完成时,您可以通过处理程序、信号量或其他方法向线程A发送消息 看看你的代码,你似乎应该扔掉它,用定时器重新实现它。 只要在启动线程后调用.join()方法,调用线程就会等待新线程执行。 大概是这样的:
Thread t = new Thread(...);
t.start();
t.join();
这是不可能的,您正在启动一个新线程。原始线程将继续运行并退出函数。你到底想达到什么目的?是的,我实际上想做一个计时器。例如,在我的应用程序中,当用户选择播放一首歌曲时,对话框会显示一条消息“歌曲将在3,2,1秒内播放”,然后它会启动设备上的播放器,但如果应用程序找不到音乐播放器,则会显示“ResolveNotFail”将变成假的,然后活动将启动youtube;不使用线程,那么我如何制作没有线程的计时器呢?直到现在,我通过线程制作了计时器。有两种方法。在短时间内(一两秒钟),您可以简单地对处理程序执行postDelayed。在需要唤醒的很长一段时间内,通过AlarmManager发出警报。如果需要重复执行,还可以使用定时器和定时器任务。为了您的使用,我只会使用一个延迟的帖子给处理程序。这样做的好处是你仍然在主线程上,这很好,因为你所做的只是简单的UI更新。