2017-11-20 7 views
0

나는 HttpURLConnection을 사용하여 원격 URL 콘텐츠를 얻으려고하지만 빈 결과를 얻고있다. 요청을 얻는 것을 볼 수있는 charle 프록시를보고 있지만 안드로이드는 응답을 저장할 수 없다! 이 코드? 사전에 감사드립니다.HttpURLConnection을 사용하여 Android 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이 자바 스크립트 인 이유는 무엇입니까? –

답변

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 자바 스크립트 함수에 결과를 전달하기 위해 onPostExecute를 사용할 수 있는지 보여 줄 수 있습니까? – user1788736