【问题标题】:Trying to get response from REST request试图从 REST 请求中获得响应
【发布时间】:2017-06-22 22:48:08
【问题描述】:

我有一个 android 应用程序,我试图在我的 android 应用程序的另一个类文件中得到一个 REST 调用的响应。

这是进行 REST 调用的类文件:

public class YouTubeVidIDs extends AsyncTask<String, String, String> {
    public String current_YTVidID;

    @Override
    public String doInBackground(String... params) {
        String subYTURL_0 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UCos52azQNBgW63_9uDJoPDA";
        String subYTURL_1 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCos52azQNBgW63_9uDJoPDA";
        String subYTURL_2 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCROKYPep-UuODNwyipe6JMw";
        String subYTURL_3 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCN_mfNT4sUszWKfi0Urjv-g";

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(subYTURL_0)
                .get()
                //.addHeader("accept", "*/*")
                .build();
        try {
            String response = client.newCall(request).execute().toString();
            current_YTVidID = response;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return current_YTVidID;
    }

    public void setCurrent_YTVidID(String current_YTVidID) {
        this.current_YTVidID = current_YTVidID;
    }

    public String getCurrent_YTVidID() {
        return this.current_YTVidID;
    }
}

我正在尝试将结果拉入另一个类文件,如下所示:

YouTubeVidIDs newID = new YouTubeVidIDs();
            String YT_ID = newID.getCurrent_YTVidID();

            Movie movie1 = new Movie();
            movie1.setId(1);
            movie1.getId(1);
            movie1.setTitle("Masjid Al-Haram");
            movie1.setStudio("Mekkah, KSA");
            movie1.setDescription("Live Stream of Masjid Al-Haram");
            movie1.setCardImageUrl("http://3.bp.blogspot.com/-ZKjKucsPdzI/TudWC99CE_I/AAAAAAAAAD8/qvWdDtw5IW0/s1600/%2528393%2529.jpg");
            movie1.setyTubeID(YT_ID);

运行时出现以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: software.blackstone.tvsunnahboxmenu, PID: 3514
                  java.lang.IllegalStateException: android.os.DeadObjectException
                      at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.K(SourceFile:236)
                      at fpm.b(SourceFile:2715)
                      at fot.k(SourceFile:15217)
                      at vma.run(SourceFile:1051)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                   Caused by: android.os.DeadObjectException
                      at android.os.BinderProxy.transactNative(Native Method)
                      at android.os.BinderProxy.transact(Binder.java:615)
                      at com.google.android.apps.youtube.embeddedplayer.service.service.jar.IApiPlayerService$Stub$Proxy.e(SourceFile:473)
                      at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.K(SourceFile:233)
                      at fpm.b(SourceFile:2715) 
                      at fot.k(SourceFile:15217) 
                      at vma.run(SourceFile:1051) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

当我在物理设备上运行它时 - YT 视频的微调器只是旋转和旋转,视频似乎永远不会加载,并且它根本不会在 Android Studio 的应用运行窗口中返回错误消息。

谁能帮助我了解我在哪里出错以及解决此问题的最佳方法是什么?

【问题讨论】:

  • 调用 newID.excute().

标签: java android rest youtube-api


【解决方案1】:

解释

您错误地使用了AsyncTask

AsyncTaskimplements 4 步。

  1. onPreExecute
  2. doInBackground
  3. onProgressUpdate
  4. onPostExecute

如果完成您的 doInBackground 则致电 onPostExecute

因此,你必须使用onPostExecute来处理。

您必须检查参考。有详细的解释。

解决方案

实现事件处理接口。

public YourClass implements IYoutubeTask
{
    //....

    public yourFunction()
    {
        YouTubeVidIDs newID = new YouTubeVidIDs(this);

        //excute asynctask
        newID.execute();

        // you can used to new YouTubeVidIDs().execute(); 
    }

    //....

    @Override
    public void onFinished(String YT_ID)
    {
        Movie movie1 = new Movie();
        movie1.setId(1);
        movie1.getId(1);
        movie1.setTitle("Masjid Al-Haram");
        movie1.setStudio("Mekkah, KSA");
        movie1.setDescription("Live Stream of Masjid Al-Haram");
        movie1.setCardImageUrl("http://3.bp.blogspot.com/-ZKjKucsPdzI/TudWC99CE_I/AAAAAAAAAD8/qvWdDtw5IW0/s1600/%2528393%2529.jpg");
        movie1.setyTubeID(YT_ID);
    }

    //...

    public interface IYoutubeTask
    {
        void onFinished(String YT_ID);
    }
}

异步任务

// Notice.
// you don't need AsyncTask<String, String, String>
// AsyncTask<[Params], [Progess], [Result]>
// Recommend AsyncTask<Void, Void, String> for your source code.

public class YouTubeVidIDs extends AsyncTask<String, String, String> {
    public String current_YTVidID;
    private IYoutubeTask handler; 

    public YouTubeVidIDs(IYoutubeTask handler)
    {
        this.handler = handler;
    }

    @Override
    public String doInBackground(String... params) {
        String subYTURL_0 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UCos52azQNBgW63_9uDJoPDA";
        String subYTURL_1 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCos52azQNBgW63_9uDJoPDA";
        String subYTURL_2 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCROKYPep-UuODNwyipe6JMw";
        String subYTURL_3 = "https://sunnahboxservice.herokuapp.com/management/youtubeapi/liveStream?channelId=UUCN_mfNT4sUszWKfi0Urjv-g";

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(subYTURL_0)
                .get()
                //.addHeader("accept", "*/*")
                .build();
        try {
            String response = client.newCall(request).execute().toString();
            current_YTVidID = response;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return current_YTVidID;
    }

    // implements onFinished method.
    protected void onPostExecute(String result) {
        handler.onFinished(result);
    }

    public void setCurrent_YTVidID(String current_YTVidID) {
        this.current_YTVidID = current_YTVidID;
    }

    public String getCurrent_YTVidID() {
        return this.current_YTVidID;
    }
}

参考

https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

    【解决方案2】:

    返回的字符串current_YTVidID 被声明为类成员,为完成doInBackground() 中的工作而创建的类的实例在包含其所有参数的方法运行后被释放。

    尝试在方法 (doInBackground) 中声明 current_YTVidID - 这应该将结果作为与处理它的实例无关的字符串返回。

    【讨论】:

    • 我按照你的建议做了,我的 getter 和 setter 现在显示错误。我在做什么错(getter 和 setter 与上面发布的形式相同)?
    • 移除 getter 和 setter - 它们不再需要。
    • 你打电话了吗 newId.execute("");这样 doinbackground 就可以工作了
    • @alfasin:是的,我做到了,应用程序仍然出错。我现在如何从我刚刚更改的类文件中获取结果字符串(很抱歉提出这样一个琐碎的问题)?
    • 很难猜出您现在遇到了哪个错误。请使用当前运行的代码、您遇到的错误、完整的堆栈跟踪(如果适用)以及触发错误的行来更新问题。
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2023-03-27
    • 2017-01-20
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2022-01-08
    • 2013-04-02
    相关资源
    最近更新 更多