Reputation: 141
How to pass value of string from class to background service ? I have created android application to read ip address from url and I want to pass value from textResult string to STREAM_URL inside background service! How can I do that ?
public class BackgroundService extends Service implements OnCompletionListener
{
MediaPlayer mediaPlayer;
private String STREAM_URL;
final String textSource = "http://audiophileradio.stream/Ip.txt";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate()
{
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
new MyTask().execute();
return START_STICKY;
}
public void onDestroy() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
public void onCompletion(MediaPlayer _mediaPlayer) {
stopSelf();
}
@Override
public boolean onUnbind(Intent intent)
{
return super.onUnbind(intent);
}
private class MyTask extends AsyncTask<Void, Void, String>
{
String textResult;
@Override
protected String doInBackground(Void... params) {
URL textUrl;
try {
textUrl = new URL(textSource);
BufferedReader bufferReader
= new BufferedReader(new InputStreamReader(textUrl.openStream()));
String StringBuffer;
String stringText = "";
while ((StringBuffer = bufferReader.readLine()) != null) {
stringText += StringBuffer;
}
bufferReader.close();
textResult = stringText;
return textResult;
} catch (MalformedURLException e) {
e.printStackTrace();
textResult = e.toString();
} catch (IOException e) {
e.printStackTrace();
textResult = e.toString();
}
return null;
}
@Override
protected void onPostExecute(String result) {
Log.d("DebugTag", "Value: " + textResult);
super.onPostExecute(result);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(BackgroundService.this);
String radio = sharedPreferences.getString("station", "8000");
if (radio != null && radio.equals("8000"))
{
STREAM_URL = "http://178.149.88.126:8000/";
}
if (radio != null && radio.equals("8010"))
{
STREAM_URL = "http://178.149.88.126:8010/";
}
if (radio != null && radio.equals("8020"))
{
STREAM_URL = "http://178.149.88.126:8020/";
}
if (radio != null && radio.equals("8030"))
{
STREAM_URL = "http://178.149.88.126:8030/";
}
mediaPlayer = new MediaPlayer();
if (!mediaPlayer.isPlaying())
{
try
{
mediaPlayer.reset();
mediaPlayer.setDataSource(STREAM_URL);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mp)
{
mediaPlayer.start();
}
});
} catch (IOException e)
{
e.printStackTrace();
}
}
mediaPlayer.setOnCompletionListener(BackgroundService.this);
}
}
}
Upvotes: 0
Views: 205
Reputation: 4705
Another way is using broadcast receiver following is the example
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.Nullable;
public class TempService extends Service {
BroadcastReceiver broadcastReceiver;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals("UpdateUrl")) {
Bundle bundle = intent.getExtras();
if (bundle != null && bundle.containsKey("urlNew")) {
String newUrl = bundle.getString("urlNew");
}
}
}
};
IntentFilter intentFilter = new IntentFilter("UpdateUrl");
registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
if(broadcastReceiver!=null){
unregisterReceiver(broadcastReceiver);
}
}
}
And where from update put following code,
Intent intent = new Intent();
intent.setAction("UpdateUrl");
intent.putExtra("urlNew", "" + newUrl);
sendBroadcast(intent);
Upvotes: 0
Reputation: 492
On the opPostExecute of the aynctask, you can use the result string of. The UI thread. You could also set a global variable in the class to be set with the value in onPostExecute.
@Override
public void onCreate()
{}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
new MyTask().execute();
return START_STICKY;
}
private class MyTask extends AsyncTask<Void, Void, String>
{
String textResult;
@Override
protected String doInBackground(Void... params) {
URL textUrl;
try {
textUrl = new URL(textSource);
BufferedReader bufferReader
= new BufferedReader(new InputStreamReader(textUrl.openStream()));
String StringBuffer;
String stringText = "";
while ((StringBuffer = bufferReader.readLine()) != null) {
stringText += StringBuffer;
}
bufferReader.close();
textResult = stringText;
return textResult;
} catch (MalformedURLException e) {
e.printStackTrace();
textResult = e.toString();
} catch (IOException e) {
e.printStackTrace();
textResult = e.toString();
}
return null;
}
@Override
protected void onPostExecute(String result) {
Log.d("DebugTag", "Value2: " + textResult);
super.onPostExecute(result);
STREAM_URL = result;
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(BackgroundService.this);
String radio = sharedPreferences.getString("station", "8000");
if (radio != null && radio.equals("8000"))
{
STREAM_URL = "http://178.149.88.126:8000/";
}
if (radio != null && radio.equals("8010"))
{
STREAM_URL = "http://178.149.88.126:8010/";
}
if (radio != null && radio.equals("8020"))
{
STREAM_URL = "http://178.149.88.126:8020/";
}
if (radio != null && radio.equals("8030"))
{
STREAM_URL = "http://178.149.88.126:8030/";
}
mediaPlayer = new MediaPlayer();
try
{
mediaPlayer.setDataSource(STREAM_URL);
} catch (IOException e)
{
e.printStackTrace();
}
mediaPlayer.setOnCompletionListener(BackgroundService.this);
}
}
Upvotes: 1