将数据从服务发送到碎片,Android

将数据从服务发送到碎片,Android,android,android-fragments,service,android-service,Android,Android Fragments,Service,Android Service,晚上好

晚上好<我在服务方面有点小问题。首先,我有几个文本视图片段。在这些文本视图中,我想从我的服务中输入文本。这是我简单服务的代码

public class ChallengeService extends Service {
    final String LOG_TAG = "myLogs";
    private String url = "";
    public static ArrayList<Exercises> exercises = new ArrayList<>();

    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "onCreate");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        url = intent.getStringExtra("Challenge_URL");
        new getChallenge(url).execute();
        return super.onStartCommand(intent, flags, startId);
    }

    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
    }

    public IBinder onBind(Intent intent) {
        Log.d(LOG_TAG, "onBind");
        return null;
    }

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

        String mUrl;
        OkHttpClient client = new OkHttpClient();
        String result = "";

        public getChallenge(String url) {
            this.mUrl = url;
        }

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;

        @Override
        protected String doInBackground(Void... params) {
            Log.d("Background", "inBackground");
            try {
                URL mUrl = new URL(url);
                Log.d("URL!!!!", "url = " + url);
                urlConnection = (HttpURLConnection) mUrl.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();
                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
                result = buffer.toString();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }

        @Override
        protected void onPostExecute(String strJson) {
            super.onPostExecute(strJson);
            Log.d(LOG_TAG, strJson + " " + url);
            exercises = ParseJSON.ChallengeParseJSON(strJson);
            Log.d("Challenges", "challenges: " + exercises.get(0).getName() + " " + exercises.get(1).getName());
        }
    }
}
公共类ChallengeService扩展服务{
最终字符串日志\u TAG=“myLogs”;
私有字符串url=“”;
公共静态ArrayList练习=新建ArrayList();
public void onCreate(){
super.onCreate();
Log.d(Log_标签,“onCreate”);
}
公共int onStartCommand(Intent Intent、int标志、int startId){
Log.d(Log_标签,“onStartCommand”);
url=intent.getStringExtra(“挑战url”);
新建getChallenge(url).execute();
返回super.onStartCommand(intent、flags、startId);
}
公共空间{
super.ondestory();
Log.d(Log_标签“onDestroy”);
}
公共IBinder onBind(意向){
Log.d(Log_标签,“onBind”);
返回null;
}
公共类getChallenge扩展异步任务{
弦乐;
OkHttpClient=新的OkHttpClient();
字符串结果=”;
公共getChallenge(字符串url){
this.mUrl=url;
}
HttpURLConnection-urlConnection=null;
BufferedReader reader=null;
@凌驾
受保护字符串doInBackground(无效…参数){
日志d(“背景”、“背景”);
试一试{
URL mUrl=新URL(URL);
Log.d(“URL!!!!”,“URL=“+URL”);
urlConnection=(HttpURLConnection)mUrl.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();
InputStream InputStream=urlConnection.getInputStream();
StringBuffer=新的StringBuffer();
reader=新的BufferedReader(新的InputStreamReader(inputStream));
弦线;
而((line=reader.readLine())!=null){
buffer.append(行);
}
结果=buffer.toString();
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串strJson){
super.onPostExecute(strJson);
Log.d(Log_标记,strJson+“”+url);
exercises=ParseJSON.ChallengeParseJSON(strJson);
Log.d(“挑战”,“挑战:+练习.获取(0).getName()+”“+练习.获取(1).getName());
}
}
}
我需要将练习列表发送给我的片段,我如何制作?
我是服务新手,我不知道,请帮助我,你可以用两种方法

  • 将数据保存到数据库并获取片段中的数据
  • 使用广播

  • 只需广播服务的结果,并通过广播接收器在片段中接收它

    例如,您可以像这样在
    onPostExecute
    中广播您的练习

        @Override
        protected void onPostExecute(String strJson) {
            super.onPostExecute(strJson);
            Log.d(LOG_TAG, strJson + " " + url);
            exercises = ParseJSON.ChallengeParseJSON(strJson);
            Log.d("Challenges", "challenges: " + exercises.get(0).getName() + " " + exercises.get(1).getName());
    
            Intent intent = new Intent(FILTER); //FILTER is a string to identify this intent
            intent.putExtra(MY_KEY, exercises); 
            sendBroadcast(intent);
        }
    
    然而,你的锻炼对象需要是这样才能顺利进行。或者您可以广播原始json字符串并调用
    ParseJSON.ChallengeParseJSON(strJson)在片段中

    然后在片段中创建一个接收器

    private BroadcastReceiver receiver = new BroadcastReceiver() {
    
    @Override
    public void onReceive(Context context, Intent intent) {
      ArrayList<Exercises> exercises = intent.getExtras().get(MY_KEY);
    
      //or
      //exercises = ParseJSON.ChallengeParseJSON(intent.getStringExtra(MY_KEY));
    
       }
    };
    
    您还需要使用
    getActivity(),在onPause中注销它


    如果您有兴趣,也可以阅读更多有关它的内容

    您对如何持续进行此操作有何想法?在我的应用程序中,每次值发生变化时都需要接收数据。这是将数据从服务发送到片段的最佳方式吗?还有别的办法吗?你能提供证明你的答案的文件吗。谢谢
      @Override
     protected void onResume() {
       super.onResume();
       getActivity().registerReceiver(receiver, new IntentFilter(FILTER));
     }