Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Android中的异步任务不能正常工作_Android_Android Asynctask - Fatal编程技术网

为什么Android中的异步任务不能正常工作

为什么Android中的异步任务不能正常工作,android,android-asynctask,Android,Android Asynctask,我有一个活动,这是启动活动,我想在其中加载2首音乐,当加载完成后,我想开始我的欢迎页面,不幸的是我做错了什么 尽管我得到了加载完成时制作的日志,但我也得到了未加载2首音乐时的日志 日志 代码 package com.Syriatel.EatTel; 导入android.app.Activity; 导入android.content.Intent; 导入android.media.AudioManager; 导入android.media.SoundPool; 导入android.media.So

我有一个活动,这是
启动活动
,我想在其中加载2首音乐,当加载完成后,我想开始我的欢迎页面,不幸的是我做错了什么

尽管我得到了加载完成时制作的
日志,但我也得到了未加载2首音乐时的日志

日志 代码
package com.Syriatel.EatTel;
导入android.app.Activity;
导入android.content.Intent;
导入android.media.AudioManager;
导入android.media.SoundPool;
导入android.media.SoundPool.OnLoadCompleteListener;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
公共课堂活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
新建Load1()。执行(1);
新的Load2()。执行(2);
}
公共int soundID,soundID2;
私人声音池声音池1、声音池2;
布尔isLoad1,isLoad2;
类Load2扩展了异步任务{
@凌驾
受保护的void onPostExecute(整数结果){
super.onPostExecute(结果);
if(isLoad1和isLoad2){
意图=新意图(Splash.this、Welcome.class);
完成();
星触觉(意向);
}否则{
Log.e(“2”,“不是2”);
}
}
@凌驾
受保护的整数doInBackground(整数…参数){
soundPool2=新的声音池(10,AudioManager.STREAM_MUSIC,0);
soundPool2.setOnLoadCompleteListener(新的OnLoadCompleteListener(){
@凌驾
public void onLoadComplete(声音池声音池,int-sampleId,
int状态){
isLoad2=真;
Log.e(“加载2”,“真实”);
}
});
soundID2=soundPool2.load(getApplicationContext(),R.raw.select,1);
返回1;
}
}
类Load1扩展了异步任务{
@凌驾
受保护的void onPostExecute(整数结果){
super.onPostExecute(结果);
if(isLoad1和isLoad2){
意图=新意图(Splash.this、Welcome.class);
完成();
星触觉(意向);
}否则{
Log.e(“1”,“不是2”);
}
}
@凌驾
受保护的整数doInBackground(整数…参数){
soundPool1=新的声音池(10,AudioManager.STREAM_MUSIC,0);
soundPool1.setOnLoadCompleteListener(新的OnLoadCompleteListener(){
@凌驾
public void onLoadComplete(声音池声音池,int-sampleId,
int状态){
isLoad1=true;
Log.e(“加载1”,“真实”);
}
});
soundID=soundPool1.load(getApplicationContext(),R.raw.thip,1);
返回1;
}
}
}

这里的逻辑有问题。您已经开始了两个模拟作业。在每一份工作中,你都会要求两个雕像都装好

if (isLoad1 && isLoad2) {

}else{

}

我的解决方案是你可以创建第三个线程。检查两者的加载状态。如果还没有准备好,那就睡一觉,然后再次检查。希望这对这里的逻辑有帮助。您已经开始了两个模拟作业。在每一份工作中,你都会要求两个雕像都装好

if (isLoad1 && isLoad2) {

}else{

}

我的解决方案是你可以创建第三个线程。检查两者的加载状态。如果还没有准备好,那就睡一觉,然后再次检查。希望通过此帮助

从onCreate()中删除以下代码,并将其放在load1的PostExecute()上


并在load2的PostExecute()中编写并启动欢迎活动。

从onCreate()中删除以下代码并将其放在load1的PostExecute()上


在load2的PostExecute()中编写并启动欢迎活动。

在我看来,这两个异步任务很可能都正常运行,但由于无法预测它们完成的顺序,因此无法预测这两个标志都将在PostExecute中设置,事实上很可能不会设置。这将导致两个异步任务无法启动您的意图。此外,您可能希望向布尔标志添加volatile修饰符,以确保始终使用“最新”值。实际上,看看你的代码,我不认为你真的想使用两个异步任务…

在我看来,这两个异步任务很可能都正常运行,但因为你无法预测它们完成的顺序,你无法预测这两个标志都将在postexecute中设置,事实上很可能不会。这将导致两个异步任务无法启动您的意图。此外,您可能希望向布尔标志添加volatile修饰符,以确保始终使用“最新”值。实际上,看看你的代码,我认为你并不想使用两个异步任务…

问题是你在每个
异步任务中创建了一个单独的线程。当你打电话的时候

soundID = soundPool1.load(getApplicationContext(), R.raw.thip, 1);
一个单独的线程开始加载音乐。但是,
AsyncTask
将在其线程中继续,完成
doInBackground
,转到
onPostexecute
,当它到达那里时,将不会设置任何标志,因为
soundPool1.load()
和soundPool2.load()`仍在运行

您的代码正按照预期执行

要解决这个问题,使用您的代码结构,您需要向两个
doInBackground
方法添加一些代码。以下是更新的第2条:

protected Integer doInBackground(Integer... params) {
    soundPool2 = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool2.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            isLoad2 = true;
            Log.e("Loaded 2", "true");
        }
    });
    soundID2 = soundPool2.load(getApplicationContext(), R.raw.select, 1);

    // New Code so we wait until the load is complete
    while(isLoad2 == false) {
        Thread.sleep(1000); // 1 second (change as you feel fit)
    }
然后,只有当音乐实际加载时,它才会进入
onPostExecute
。确保初始化标志也是明智的,因此在每个异步任务中:

@override
protected void onPreExecute() {
    isLoadX = false
}

如果您正在计划许多异步任务,那么您应该阅读和。

问题是您正在从创建一个单独的线程
protected Integer doInBackground(Integer... params) {
    soundPool2 = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool2.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            isLoad2 = true;
            Log.e("Loaded 2", "true");
        }
    });
    soundID2 = soundPool2.load(getApplicationContext(), R.raw.select, 1);

    // New Code so we wait until the load is complete
    while(isLoad2 == false) {
        Thread.sleep(1000); // 1 second (change as you feel fit)
    }
@override
protected void onPreExecute() {
    isLoadX = false
}