2017-02-22 4 views
-2

私はアンドロイドで新しく、私が作成したスレッドについて質問します。私はそれが愚かな質問だと思うが、私は申し訳ありません。私は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); これは私のlogcatある

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(); 
     } 

    } 
} 

すべてがOKですが、スレッドが開始されると、数秒後に私の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 

私がしたいですスレッドからのファイルのサイズを取得することは、私はスレッドまたは終了標準的な方法をスリープ状態に持っていることが正しいことをfirst.is?あなたはその実行順序を負いかねますのスレッドで作業するとき、私はアンドロイド

+0

コールバックを作成し、「スレッドの終わり」からのコールバックを呼び出して、calbackでスレッドからの結果を必要とするスタッフを行う...スレッドを待っている: あなたのコードは多少このようにする必要があります結果は 'addURLToList'の内部ではスレッドが役に立たなくなってしまいます(NetworkOnMainThreadExcpetionを知っています...しかし、それはメインスレッドをブロックしないためです) – Selvin

+0

なぜいくつかの人々がマイナスを投稿する理由はわかりません?アンドロイドの新機能あなたが私に答えることを望まないなら、答えないでください、なぜマイナスを与えるのですか! –

+0

@セルビンありがとうございます。あなたについてのチュートリアルのリンクを送ることができますか? –

答えて

0

に新しいです申し訳ありません。

私はあなたの新しいスレッドが接続が確立されるのを待っている間に元のスレッドが初期化されていないlenghtOfFile変数で実行されているように見えることを想定しています。もう1つの可能性は、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); 
関連する問題