Android入门:获取MySQL/PHP的JSON数据后如何显示到TextView?
解决Android中从Service传递数据到UI更新TextView的问题
嘿,作为Android入门学习者,你已经迈出了从MySQL+PHP获取数据的第一步,很棒!接下来要把数据显示到TextView里,核心是后台Service不能直接操作UI,得把数据传递给Activity来更新。咱一步步来:
第一步:完善Service中获取JSONObject的逻辑
你当前的sev_data代码里网络请求部分还没写完,先补全这部分(这里用基础的HttpURLConnection举例,你也可以用OkHttp简化):
public class sev_data extends IntentService { public static boolean ServiceIsRun = false; // 定义广播Action,用于和Activity通信 public static final String ACTION_UPDATE_UI = "com.example.yourapp.UPDATE_UI"; public sev_data() { super("sev_data"); } @Override protected void onHandleIntent(@Nullable Intent intent) { while (ServiceIsRun) { try { // 1. 连接PHP接口 URL url = new URL("http://你的PHP接口地址"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); // 2. 读取返回的JSON数据 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } reader.close(); conn.disconnect(); // 3. 解析JSONObject JSONObject jsonObject = new JSONObject(sb.toString()); String title = jsonObject.getString("title"); // 这里的键要和PHP返回的一致 String message = jsonObject.getString("message"); // 同理 // 4. 发送广播,把数据传给Activity Intent broadcastIntent = new Intent(ACTION_UPDATE_UI); broadcastIntent.putExtra("title", title); broadcastIntent.putExtra("message", message); sendBroadcast(broadcastIntent); // 避免频繁请求,加个延迟 Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } } } }
第二步:在Activity中接收广播并更新UI
在你的主Activity里,注册一个广播接收器,接收Service发来的数据,然后更新对应的TextView:
public class MainActivity extends AppCompatActivity { private TextView txtTitle; private TextView txtmessage; private BroadcastReceiver uiUpdateReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化TextView txtTitle = findViewById(R.id.txtTitle); txtmessage = findViewById(R.id.txtmessage); // 注册广播接收器 uiUpdateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (sev_data.ACTION_UPDATE_UI.equals(intent.getAction())) { // 获取Service传来的数据 String title = intent.getStringExtra("title"); String message = intent.getStringExtra("message"); // 更新UI(这里在主线程,直接操作即可) txtTitle.setText(title); txtmessage.setText(message); } } }; IntentFilter filter = new IntentFilter(sev_data.ACTION_UPDATE_UI); registerReceiver(uiUpdateReceiver, filter); // 启动Service(记得在Manifest里注册Service) Intent serviceIntent = new Intent(this, sev_data.class); sev_data.ServiceIsRun = true; startService(serviceIntent); } @Override protected void onDestroy() { super.onDestroy(); // 销毁时注销广播,避免内存泄漏 unregisterReceiver(uiUpdateReceiver); // 停止Service sev_data.ServiceIsRun = false; } }
第三步:别忘了配置权限和注册Service
- 在
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
- 注册你的Service:
<service android:name=".sev_data"/>
几个关键提醒
- PHP返回的JSON格式要正确:比如应该是
{"title":"我的标题","message":"这是消息内容"}这种格式,确保键名和你代码里的getString("title")一致。 - 避免ANR:IntentService的
onHandleIntent本身是在后台线程,所以网络请求不会阻塞主线程,这点没问题。 - 内存泄漏问题:Activity销毁时一定要注销广播接收器,停止Service。
内容的提问来源于stack exchange,提问作者Hls
相关产品推荐
相关产品推荐

