getResponseCode()에 대한 오류

4756 단어 Android
// 2.        ,       
    public void click(View v) {
        try {
            // 2.1      
            String path = et_path.getText().toString().trim();
            // 2.2  URL  ,          (  )
            URL url = new URL(path);
            // 2.3  httpurlconnection  ,          
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 2.4    get  
            conn.setRequestMethod("GET"); // get    ,   get  
            // 2.5        
            conn.setConnectTimeout(5000);
            // 2.6           
            int code = 0;
            code = conn.getResponseCode();
            // 2.7  code==200      
            Log.d(TAG, code + "====================================");
            if (code == 200) {
                // 2.8          ,         ,                 
                //          Utils
                InputStream in = conn.getInputStream();
                // 2.9         in   String
                String content = StreamTools.readStream(in);
                tv_result.setText(content);
            }
        } catch (MalformedURLException e) {
            Toast.makeText(MainActivity.this, "     ", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        } catch (IOException e) {
            Toast.makeText(MainActivity.this, "        ", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
         
    }

버림 예외:Caused by:android.os.NetworkOnMainThreadException
솔루션: Oncreate() 메서드에
시나리오 1:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

시나리오 2:
다음과 같이 새 스레드를 실행합니다.
new Thread() {
            public void run() {
                try {
                    // 2.1      
                    String path = et_path.getText().toString().trim();
                    // 2.2  URL  ,          (  )
                    URL url = new URL(path);
                    // 2.3  httpurlconnection  ,          
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    // 2.4    get  
                    conn.setRequestMethod("GET"); // get    ,   get  
                    // 2.5        
                    conn.setConnectTimeout(5000);
                    // 2.6           
                    int code = 0;
                    code = conn.getResponseCode();
                    // 2.7  code==200      
                    Log.d(TAG, code + "====================================");
                    if (code == 200) {
                        // 2.8          ,         ,                 
                        //          Utils
                        InputStream in = conn.getInputStream();
                        // 2.9         in   String
                        String content = StreamTools.readStream(in);
                        tv_result.setText(content);
                    }
                } catch (MalformedURLException e) {
                    Toast.makeText(MainActivity.this, "     ", Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                } catch (IOException e) {
                    Toast.makeText(MainActivity.this, "        ", Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
            }
        }.start();

버튼을 누르면 결과가 나오지만, 플래시, 이상 던지기android가 나타납니다.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.잘못된 스레드에서 UI를 업데이트하는 방법에 대해 설명합니다.
Android에서 관련된view와 컨트롤 작업은 모두 라인이 안전하지 않기 때문에 Android는 비 UI 라인에서 UI를 업데이트하는 것을 금지한다. 예를 들어Activity에서 직접 하위 라인을 만들고 하위 라인에서 UI를 직접 조작하는 등 현시적인 불법 작업에 대해 Android는 이상적으로 종료하고 should run on UIthread와 같은 오류 로그 정보를 알린다.그러나 스텔스 방식의 불법 조작에 대해 App은 직접적이고 난폭하게 이상하게 탈퇴하지 않는다. 단지 이상한 결과가 나타날 뿐이다. Only the original thread that created a view hierarchy can touch its views는 하나의 예이다. 글자의 뜻은 보기 차원 구조를 만드는 원래의 라인만 그의 View를 조작할 수 있다는 것이다. 이것은 라인 안전과 관련된 것이 분명하다.
요약 정보:
네트워크 연결, 빅데이터 복사, 절전 등 주 스레드(UI 스레드)에서는 시간이 많이 걸리는 작업을 할 수 없습니다.
예를 들면 구글 네트워크를 연결하는 것이다.warning:java.net.SocketTimeoutException: connect timed out
주 스레드 시간 초과 info: The application may be doing too much work on its main thread.
4.0 이후 구글은 네트워크 연결을 강제로 메인 라인에서 접근할 수 없게 했다
주 스레드(UI 스레드)만 UI 업데이트 가능
 
 
=================================Talk is cheap, show me the code===============================

좋은 웹페이지 즐겨찾기