java - 如何将 MediaPlayer 对象从 JobScheduler 的 JobService 传递给 AsyncTask

标签 java android

我正在使用 JobScheduler,它使用 AsyncTask 作为其 JobService。在扩展 AsyncTask 的类 MJobExecutor 中使用 MediaPlayer。我想传递媒体播放器对象但如何传递。以下是我的 AsyncTask 代码 名为 MJobExecutor.java 的类 我已经创建了一个构造函数来传递 MediaPlayer 对象。但代码似乎不起作用。

public class MJobExecutor extends AsyncTask<Void,Void,String> {

ValueExchange value;
private MediaPlayer player;
//Constructor to pass MediaPlayer object.
public MJobExecutor(MediaPlayer player){
    this.player = player;
}
@Override
protected String doInBackground(Void... params) {

    value = new ValueExchange();
    Calendar cal = Calendar.getInstance();
    Date date=cal.getTime();
    DateFormat dateFormat = new SimpleDateFormat("hh:mm a");
    String formattedDate=dateFormat.format(date);
    if(formattedDate.equals(value.getString())){

    }
    play();
    return "Long running task finishes." + value.getString();
}



private void play(){
    if(player == null){
        //Below the getApplicationContext() not working even after the constructor-
        //being declared.
        player = MediaPlayer.create(getApplicatioContext(),R.raw.bensoundfunkyelement);
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stopPlayer();
            }
        });
    }
    player.start();
}
private void stop(){
    stopPlayer();
}
private void stopPlayer(){
    if(player != null){
        player.release();
        player = null;
    }
}

}

再次在扩展 JobService 的 MJobScheduler.java 类中,传递了 MediaPlayer 对象。但它还不起作用。

public class MJobScheduler extends JobService {

MJobExecutor mJobExecutor;
String alarmTime;
ValueExchange value;
MediaPlayer player;
@Override
public boolean onStartJob(final JobParameters params) {
    alarmTime = params.getExtras().getString("alarmTime");
    value = new ValueExchange();
    value.setString(alarmTime);
    //MediaPlayer object is Passed into the constructor-
    //but the app crashes
    mJobExecutor = new MJobExecutor(player){

        @Override
        protected void onPostExecute(String s) {
            Toast.makeText(getApplicationContext(),alarmTime+" "+s,Toast.LENGTH_LONG).show();
            jobFinished(params,false);
        }
    };
    mJobExecutor.execute();
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    mJobExecutor.cancel(false);
    return false;
}
}

主要 Activity 类如下...

public class MainActivity extends AppCompatActivity {

private static final int JOB_ID = 101;
JobScheduler jobScheduler;
JobInfo jobInfo;



TextView textTime;
ImageButton ibLeft,ibRight,ibTop,ibBottom;
TextClock textClock;



String alarmTime = "12:00 AM";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    textTime = (TextView)findViewById(R.id.textView);
    ibLeft = (ImageButton)findViewById(R.id.left);
    ibRight = (ImageButton)findViewById(R.id.right);
    ibTop = (ImageButton)findViewById(R.id.top);
    ibBottom = (ImageButton)findViewById(R.id.bottom);

    textClock.setPadding(0,250,0,0);


    ComponentName componentName = new ComponentName(this,MJobScheduler.class);
    PersistableBundle bundle = new PersistableBundle();
    bundle.putString("alarmTime",alarmTime);

    JobInfo.Builder builder = new JobInfo.Builder(JOB_ID,componentName);

    builder.setExtras(bundle);
    builder.setPeriodic(5000);
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
    builder.setPersisted(true);
    jobInfo = builder.build();
    jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);



}


public void Start(View view) {

    jobScheduler.schedule(jobInfo);
    Toast.makeText(this,"Job Started...",Toast.LENGTH_LONG).show();
}

public void Stop(View view) {
    jobScheduler.cancel(JOB_ID);
    Toast.makeText(this,"Job Cancelled...",Toast.LENGTH_LONG).show();
}


}

最佳答案

MJobScheduler 类中实例化您的 MediaPlayer 对象,这样您就不需要 AsyncTask 中的上下文。

player = MediaPlayer.create(getApplicatioContext(),R.raw.bensoundfunkyelement);

将上述行从 MJobExecutor 类中的方法 play 移至 MJobScheduler 类的 onStartJob 方法,位于 mJobExecutor = new MJobExecutor(player)...

行之前

然后在您的方法 play 中,删除条件检查 if(player == null) 因为它始终为 false,从而阻止执行其中的代码。

因此,您的方法 onStartJob 的主体将如下所示:

alarmTime = params.getExtras().getString("alarmTime");
value = new ValueExchange();
value.setString(alarmTime);

player = MediaPlayer.create(getApplicatioContext(), R.raw.bensoundfunkyelement);
mJobExecutor = new MJobExecutor(player){

    @Override
    protected void onPostExecute(String s) {
        Toast.makeText(getApplicationContext(),alarmTime+" "+s,Toast.LENGTH_LONG).show();
        jobFinished(params,false);
    }
};
mJobExecutor.execute();
return true;

您的 play 方法如下:

private void play() {
    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            stopPlayer();
        }
    });
    player.start();
}

关于java - 如何将 MediaPlayer 对象从 JobScheduler 的 JobService 传递给 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147674/

相关文章:

android - 禁用或删除 NetworkImageView-Volley 中的缓存

android - 在约束布局中使用 NestedScrollView 的问题

Java - 通过套接字发送证书

java - HashMap使用对象实现一键多值

java - 如何用Java创建猜谜游戏的高分表?

java - Spring Boot 在 WebSocket 上使用 Stomp : Handshake failed due to invalid Upgrade header: null

java - FindBugs插件Eclipse发现的错误

java - 在 android 中调用 API 并使用 Retrofit 2 收到此错误 :Response{protocol=h2, code=200, message=, url=https ://api. com/video/list-video.php}

c# - 如何在 xamarin C# 中的 tableLayout 中单击特定行时检索对象

android - 通过 Intent 关闭另一个 Activity 的 Activity