延迟运行线程

时间:2017-02-22 10:57:20

标签: android multithreading

我是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);


}

我创建了一个Thread,因为我想获取文件大小。

  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中的Log.i("====", "size of file after Thread: " + lenghtOfFile);获得0 这是我的logcat:

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

我想首先从线程获取文件的大小。我是否必须睡觉线程或退出标准方式?对不起我是android的新手

1 个答案:

答案 0 :(得分:0)

使用线程时,您无法承担其执行顺序。

在你的情况下会发生什么我认为当你的新线程正在等待建立连接时,原始线程正在使用未初始化的lenghtOfFile变量运行,因此日志看起来就像它一样。另一种可能性是,当记录lenghtOfFile=0行时,新线程甚至没有开始运行。这就是线程的工作方式。

出于这个目的,Android中存在ASyncTask类。 你的代码应该是这样的:

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