2017-05-12 12 views
0

クラスからバックグラウンドサービスへの文字列の値渡し方は?私は、URLからIPアドレスを読み取るためにアンドロイドアプリケーションを作成し、backgroundResult文字列からbackgroundサービス内のSTREAM_URLに値を渡したいと考えています。どうやってやるの ?Androidからクラスへのデータの受け渡し

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); 
     } 
    } 

} 
+1

ので、あなたが直面していますか?このデータをどのように渡しますか? 'onBind()'で共有値を取得する必要があります – Ibrahim

+0

これを試してみましょう。 'public static String RESULT_URL =" Default "; –

答えて

1

aynctaskのopPostExecuteでは、の結果文字列を使用できます。 UIスレッド。 onPostExecuteの値で設定されるクラス内のグローバル変数を設定することもできます。もう一つの方法は、更新プログラムの一例である

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); 
     } 
    } 

    } 

、どこで、次の放送受信機を使用している

@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); 
    } 
} 
+0

そのコードを書いてもらえますか? –

+0

Log.d( "DebugTag"、 "Value0:" + STREAM_URL)を追加すると動作しません。内部サービスonCreateメソッド私はnull値を取得する! –

+0

'MyTask extends AsyncTask 'が 'MyTask extends AsyncTask 'に変わるように文字列を返すようにAsynctaskを変更してからdoの中で結果を返します。 –

0

次のコード入れ、

Intent intent = new Intent(); 
intent.setAction("UpdateUrl"); 
intent.putExtra("urlNew", "" + newUrl); 
sendBroadcast(intent); 
+0

android.app.IntentReceiverLeaked:サービスaudiophileradio.example.com.audiophileradio.BackgroundServiceがリークしましたIntentReceiver –

+0

私はコードを更新しました。申し訳ありませんが、私はonDestroy()でReceiverの登録を忘れました。 –

+0

それは動作しません!!!! –

関連する問題