【问题标题】:How to Parse a Json from a service class in android如何从android中的服务类解析Json
【发布时间】:2018-04-14 04:38:03
【问题描述】:

我有以下代码,它可以在活动中正常工作。 但是我们如何在服务内部使用它呢?

该服务在后台运行,每当用户复制任何文本时,它都会触发 onPrimaryClipChanged(),并发出 HTTP Get 请求以将此数据发送到服务器。然后我们处理结果并根据结果显示 toast 通知。

Service 全局运行,需要作为服务在后台运行。

    @Override
    protected Void doInBackground(Void... arg0) {
       HttpHandler sh = new HttpHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url);

        if (jsonStr != null) {
            try {

                JSONObject jsonObj = new JSONObject(jsonStr);

                JSONArray place = jsonObj.getJSONArray("tuc");
                JSONObject address = place.getJSONObject(0).getJSONObject("phrase");
                meaning = address.getString("text");

            } catch (final JSONException e) {
               // Log.e(TAG, "Json parsing error: " + e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }
        } else {
         //   Log.e(TAG, "Couldn't get json from server.");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pd.isShowing())
            pd.dismiss();        


        showToast(result);

    }

}

尝试在服务类中使用相同的代码,但它不起作用。 它可以编译,但运行时什么也不做..

请帮助我,我如何在服务类中解析 json。提前谢谢你

【问题讨论】:

  • 你想在服务中解析 json 吗?给出一些情景,以便我们提供帮助。
  • 服务在后台运行,每当用户复制任何文本时,它都会触发这个json,根据文本发送一个http请求进行一些处理,然后将结果显示为toast。它是一个作为后台服务运行并在系统范围内运行的应用程序。在此服务中使用 onPrimaryClipChanged() 检测文本的复制。它工作完美。现在我需要在 http get 请求中发送这个复制的文本并从服务器取回 json,然后解析它并在 toast 中显示结果,而不显示活动。
  • 这不是在服务中执行此类操作的好方法。服务很重,消耗更多的电池和资源。您可以将 Intent 服务与 Intent Filters 一起使用,然后您可以启动透明 Activity,它可以执行所有这些操作并显示结果,然后您可以将其销毁,否则系统将销毁它。
  • 您能详细说明一下吗?我们可以从 Intent 服务中检测到文本副本吗?
  • 我对剪贴板框架了解不多。但你应该检查一下 - stackoverflow.com/questions/6931359/…

标签: java android json parsing service


【解决方案1】:

Asynctask 本身在后台运行,所以我不明白您为什么要在 bg 服务中运行 asynctask。

此链接具有设置异步任务的基础知识 https://developer.android.com/reference/android/os/AsyncTask.html

希望这会有所帮助。

【讨论】:

  • 我只使用异步任务,受保护的 Void doInBackground(Void... arg0) 是其中的一部分,如问题所示。它在活动内部工作。但问题是它在服务内部不起作用,这是强制性的。
  • 由于您在服务类中执行此操作,因此快速尝试是尝试从 runOnUiThread 可运行对象中调用 toast 方法。因为您将异步任务嵌套在服务中,所以我认为 UI 没有从 onPostExecute 更新。
  • 异步任务用于较短的操作。这个应用程序需要无限运行。此外,剪贴板管理器需要服务触发器,请阅读问题。
  • 请阅读我的最新评论。由于您在服务中使用 asynctask,因此非常值得尝试从 runOnUIThread 可运行的内部运行您的 UI 调用,以查看结果是否是您正在寻找的结果。
  • 服务无法运行 runOnUiThread(new Runnable() ;使用处理程序有一个变通方法。但这并没有解决问题。仍然没有显示结果。
【解决方案2】:

在这种情况下唯一简单的选择是启动一个透明的活动并在其中进行处理。

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="Theme.Transparent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>

这将创建一个不可见的活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2017-10-04
    • 2023-03-18
    • 1970-01-01
    • 2019-11-12
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多