晚上好!
我的服务有一些小问题。首先,我有带有几个 TextView 的 fragment 。我想将我的服务中的文本放入这些 TextView 中。我的简单服务的这段代码
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());
}
}
}
我需要将练习列表发送到我的 fragment ,我该如何制作? 我是服务新手,我不知道,请帮助我
最佳答案
只需广播您的服务的结果并通过广播接收器在您的 fragment 中接收它
例如,您可以像这样在 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);
}
但是,您的锻炼对象需要是 parcelable以使此工作顺利进行。或者您可以只广播原始 json 字符串并在 fragment 中调用 ParseJSON.ChallengeParseJSON(strJson);
然后在您的 fragment 中创建一个接收器
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));
}
};
和register它在您的 onResume
@Override
protected void onResume() {
super.onResume();
getActivity().registerReceiver(receiver, new IntentFilter(FILTER));
}
您还需要使用 getActivity().unregisterReceiver(receiver); 在 onPause 中取消注册它
您还可以阅读更多相关信息here如果有兴趣
关于android - 从Service发送数据到Fragment,Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707280/