2017-02-22 2 views
-2

저는 android에서 새롭고 저의 스레드에 대해 질문합니다. 나는 어리석은 질문이라고 생각하지만 미안합니다. 나는 onClick 버튼 리스너를 가지고 있습니다. 그 일은 URL 다운로드 링크를 얻고 변수에 저장합니다. 내가 파일 크기를 얻을 원하기 때문에실행중인 스레드가 지연되고 있습니다.

/** 
* this method invoke from setPositiveButton's dialog 
* 
* @param rootView 
*/ 
private void addURLToList(View rootView) { 

    editTextAddURL = (EditText) rootView.findViewById(R.id.editText_add_url); 

    Log.i("===", "addURLToList: " + editTextAddURL.getText()); 
    stringUrl = editTextAddURL.getText().toString(); 

    *start GetSizeOfFile thread for getting size file and store 
    * in lenghtOfFile variable 
    */ 
    new GetSizeOfFile().start(); 

    Log.i("====", "size of file after Thread: " + lenghtOfFile); 


} 

나는 스레드를 만들 수 있습니다. Log.i("====", "size of file after Thread: " + lenghtOfFile); 이 내 로그 캣입니다

private class GetSizeOfFile extends Thread { 
    @Override 
    public void run() { 
     super.run(); 
     try { 
      URL url = new URL(stringUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      lenghtOfFile = connection.getContentLength(); 
      Log.i("====", "size of file in Thread: " + lenghtOfFile); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

모든 것을 확인하지만 스레드가 시작되면, 몇 초 후에 내 lenghtOfFile 변수가 초기화되고 내가이 줄 lenghtOfFile에 0을 가지고 :

02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/===: addURLToList: http://dl2.soft98.ir/soft/a/Adobe.Shockwave.Player.12.2.7.197.IE.rar 
02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/====: file name : Adobe.Shockwave.Player.12.2.7.197.IE.rar 
02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/====: size of file after Thread: 0 
02-22 10:02:36.544 11333-11495/com.example.manifest.simplefiledownloadmanager I/====: size of file in Thread: 13524394 

내가 원하는 스레드가 처음부터 파일의 크기를 가져옵니다. 올바른 스레드를 종료하거나 표준 방법을 종료해야합니다. 미안 해요. 안드로이드에서 새로운 기능입니다.

+0

... 콜백을 생성, "스레드의 끝"에서 콜백을 호출합니다 calback에 스레드에서 결과를 필요로하는 직원을 ... 스레드 대기 결과는'addURLToList'는 쓸모없는 스레드를 만든다. (예, NetworkOnMainThreadExcpetion을 알고있다.하지만 그것은 메인 스레드를 막지 않기 위해서 만들어진 것이다.) – Selvin

+0

왜 몇몇 사람들은 어떤 게시물에 마이너스를 주는지 모르겠다. new in android 나에게 대답하고 싶지 않다면 대답하지 마라, 왜 마이너스를 준다 !!!! –

+0

@ 셀빈 감사합니다. 당신에 관한 튜토리얼 링크를 보낼 수 있습니까? –

답변

0

스레드를 사용하여 작업 할 때는 실행 순서를 지정할 수 없습니다.

당신의 경우에는 어떤 일이 벌어지는가? 새 스레드가 연결이 설정 될 때까지 기다리는 동안 원래 스레드가 초기화되지 않은 lenghtOfFile 변수와 함께 실행되어 로그가 그 것처럼 보일 것이라고 추측합니다. 또 다른 가능성은 새로운 스레드가 심지어 lenghtOfFile=0 라인이 로깅되었을 때 실행을 시작하지 않았다는 것입니다. 바로 스레드가 작동하는 방법입니다.

정확한 목적으로 ASyncTask 클래스가 Android에 있습니다. 코드는 다소 다음과 같이해야한다 : 평소와 같이

private class GetSizeOfFile extends AsyncTask<String, Void, Long> { 

    // runs on a background thread 
    protected Long doInBackground(String... stringUrls) { 
     String stringUrl = stringUrls[0]; 
     try { 
      URL url = new URL(stringUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      long lenghtOfFile = connection.getContentLength(); 
      return lenghtOfFile; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return -1; 
    } 

    // runs on main thread 
    protected void onPostExecute(Long lenghtOfFile) { 
     if (lenghtOfFile == -1) { 
      // something went wrong 
     } else { 
      Log.i("====", "size of file: " + lenghtOfFile); 
      // whatever else you want to do 
     } 
    } 
} 

new GetSizeOfFile().execute(stringUrl); 
관련 문제