2017-02-06 8 views
0

私はアンドロイドアプリを持っています。私はアンドロイドアプリで別のクラスファイルにレスポンスを返そうとしています。ここで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のアプリ実行画面でエラーメッセージが返されることはありません。

誰かが私がエラーを起こした場所を理解するのに役立ちますか?そしてこれを解決する最善の方法は何ですか?

+0

newID.excute()を呼び出します。 –

答えて

1

はあなたが間違ってAsyncTaskを使用している

を説明します。

AsyncTaskは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); 
    } 
} 

AsyncTask

// 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

0

戻り値の文字列current_YTVidIDはクラスメンバーとして宣言されています。doInBackground()で作業を行うために作成されたクラスのインスタンスは、メソッドが実行された後に解放されます。

メソッド(doInBackground)内でcurrent_YTVidIDを宣言してください。結果を処理したインスタンスに関係のない文字列として返す必要があります。

+0

私はあなたが提案した通りに、ゲッターとセッターがエラーを表示しています。私は間違って何をしているのですか(ゲッターとセッターは上記と同じ形です)? – ironmantis7x

+0

getterとsetterを削除します。不要になったものです。 – alfasin

+0

あなたはnewId.execute( "")を呼び出しました。 doinbackgroundが動作するようにしてください –

関連する問題