2017-11-20 10 views
0

私はHttpURLConnectionを使ってリモートURLコンテンツを取得しようとしていますが、空のresult.Byを取得し続けているのは、取得リクエストが実行されているのがわかりますが、アンドロイドはレスポンスを保存できません。このコード?事前に感謝します。アンドロイドでHttpURLConnectionを使用してリモートURLコンテンツを取得する方法は?

public String sendGetRequest() { 


     try { 

      StrictMode.setThreadPolicy(new Builder().permitAll().build()); 

      HttpURLConnection myURLConnection = (HttpURLConnection) new URL("http://www.bbc.com").openConnection(); 
      myURLConnection.setReadTimeout(60000); 
      myURLConnection.setConnectTimeout(60000); 
      myURLConnection.setRequestMethod("GET"); 
      myURLConnection.setUseCaches(false); 
      myURLConnection.setDoInput(true); 
      myURLConnection.setDoOutput(true); 
      myURLConnection.setRequestProperty("Content-Type", "text/plain"); 
      myURLConnection.setRequestProperty("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 6.0;)"); 

      myURLConnection.setRequestProperty("Connection", "Keep-Alive"); 
      myURLConnection.addRequestProperty("Content-length", ""); 

      OutputStream os = myURLConnection.getOutputStream(); 

      os.close(); 

      myURLConnection.connect(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(myURLConnection.getInputStream())); 

      StringBuffer sb = new StringBuffer(); 

      String line; 


      while ((line = in.readLine()) != null) { 

       sb.append(line); 

      } 


      in.close(); 

      return sb.toString(); 

     } catch (Exception e) { 

     } 
     return null; 

    } 

と私は、ボタンのonclickのから上記の関数を呼び出す:

public Button but1; 

//creating public method 
public void init() { 

but1 = (Button) findViewById(R.id.but1); 


//wire our button 
but1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 



     String finalResult = sendGetRequest(); 
     mWebView.loadUrl("javascript:displayIt(" + finalResult+ ")"); 
    } 
}); 

}

編集(使用バックグラウンド・プロセス):

public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... urls) { 

      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 

      try { 

       url = new URL(urls[0]); 

       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream in = urlConnection.getInputStream(); 

       InputStreamReader reader = new InputStreamReader(in); 

       int data = reader.read(); 

       while (data != -1) { 

        char current = (char) data; 

        result += current; 

        data = reader.read(); 

       } 

       return result; 

      } catch (Exception e) { 

       e.printStackTrace(); 

       return "Failed"; 

      } 


     } 

    } 
+0

setDoOutputはPOSTリクエスト用で、接続を開く前にbebforeを取得していますが、予想される結果を知っていません。また、なぜURLがjavascriptであるのですか? –

答えて

1

あなたは例外を確認してください:

catch (Exception e) { 
    e.printStackTrace(); 
     } 

メインスレッドで長い操作をしているからです。

バックグラウンドスレッドで長い操作を行う必要があります。

このドキュメントを参照してください:https://developer.android.com/training/multiple-threads/communicate-ui.html

更新

https://developer.android.com/reference/android/os/AsyncTask.htmlは、あなたの更新質問

を使用して、あなたのアクティビティ内のAsyncTaskを作成した場合、あなたはインターフェイスクラスを作成する必要があり、他にこれを使用することができますAsyncTaskのコンストラクタのパス

but1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     new DownloadTask().execute("http://www.bbc.com"); 
    } 
}); 

    public class DownloadTask extends AsyncTask<String, Void, String> { 



@Override 
    protected String doInBackground(String... urls) { 

    String result = ""; 
    URL url; 
    HttpURLConnection urlConnection = null; 

    try { 

     url = new URL(urls[0]); 

     urlConnection = (HttpURLConnection) url.openConnection(); 

     InputStream in = urlConnection.getInputStream(); 

     InputStreamReader reader = new InputStreamReader(in); 

     int data = reader.read(); 

     while (data != -1) { 

      char current = (char) data; 

      result += current; 

      data = reader.read(); 

     } 

     return result; 

    } catch (Exception e) { 

     e.printStackTrace(); 

     return "Failed"; 

    } 


} 


@Override 
protected void onPostExecute(String result){ 
    mWebView.loadUrl("javascript:displayIt('" + result+ "')"); 
} 

} 
+0

返事ありがとうございます。しかし、保護されたString doInBackground(String ... urls){フレームをスキップせずにWebviewにレスポンスを転送する方法はありますか?私はdoInBackground(String ... urls)内でリクエストを作成しようとしましたが、WebView UIへのレスポンスの送信方法はわかりません! – user1788736

+1

onPostExecuteメソッドを使用してUIを更新する – diegoveloper

+0

最初の投稿を更新しました。あなたはそれを見て、どのように私はwebviewのJavaScript関数に結果を渡すためにonPostExecuteを使用することができますか? – user1788736

関連する問題