You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

  1. 在AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
  1. 注册你的Service:
<service android:name=".sev_data"/>

几个关键提醒

  • PHP返回的JSON格式要正确:比如应该是{"title":"我的标题","message":"这是消息内容"}这种格式,确保键名和你代码里的getString("title")一致。
  • 避免ANR:IntentService的onHandleIntent本身是在后台线程,所以网络请求不会阻塞主线程,这点没问题。
  • 内存泄漏问题:Activity销毁时一定要注销广播接收器,停止Service。

内容的提问来源于stack exchange,提问作者Hls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:09