第二次运行线程会导致应用程序崩溃

时间:2014-02-15 03:50:03

标签: android multithreading

我使用工作线程从URL中读取文本。我的帖子如下。在第一次运行时,我确信线程运行已完成,因为我可以检查sdcard_readstrnull。 在第二次运行时,当我调用thread_download.start();时,程序崩溃了。 可能有什么不对?感谢

public class DownloadingThread extends AbstractDataDownloading {


      @Override
      public void doRun() {
        // TODO Auto-generated method stub
        try {
                // Create a URL for the desired page
                URL url = new URL(SDcard_DetailView.textfileurl);

                    // Read all the text returned by the server
                BufferedReader in = new BufferedReader(new  
                    InputStreamReader(url.openStream()));

                do{
                     sdcard_readstr = in.readLine();
                }while(sdcard_readstr!=null);
                in.close();

                } catch (MalformedURLException e) {
                } catch (IOException e) {
        }
    }
}


public abstract  class AbstractDataDownloading extends Thread{
       private final Set<ThreadCompleteListener> listeners
          = new CopyOnWriteArraySet<ThreadCompleteListener>();
       public final void addListener(final ThreadCompleteListener listener) {
            listeners.add(listener);
       }
       public final void removeListener(final ThreadCompleteListener listener) {
            listeners.remove(listener);
       }
       private final void notifyListeners() {
           for (ThreadCompleteListener listener : listeners) {
                 listener.notifyOfThreadComplete(this);
           }
       }
       @Override
       public final void run() {
          try {
                 doRun();
          } finally {
                 notifyListeners();
          }
       }
      public abstract void doRun();


}

EDIT1: 在我的线程完成通知中,我使用runOnUiThread来使用UI组件。 这会导致问题吗?

public void notifyOfThreadComplete(Thread thread) {
        // TODO Auto-generated method stub
        if(downloadingStopbuttonispressed == false){//background process completed

            textfileurl = null;

            this.runOnUiThread(new Runnable() {
                public void run() {
                    Wifibutton = (Button) findViewById(R.id.Wifiscanning); 
                    Wifibutton.setText("Load another day's data");
                    final MenuItem refreshItem = optionsMenu.findItem(R.id.airport_menuRefresh);
                    refreshItem.setActionView(null);
                }
            });


        }
    }

我在onResume()中调用了线程启动为

@Override
    protected void onResume() {
        super.onResume();
        if(textfileurl != null){
            Wifibutton.setText("Stop Data Loading");
            buttonStatus = "loading";           
            setRefreshActionButtonState(true);          
            thread_download.start();            
        }
    }

EDIT2: 我的LogCat图像已附加。 enter image description here

1 个答案:

答案 0 :(得分:3)

我的解决方案是here 。我不能在第二次重用Thread对象的相同实例。我需要创建一个新实例,以便在第二次调用Thread。所以Thread适合单次运行的进程,对于多次运行的进程,我应该使用AsyncTask。即使AsyncTack仅用于一次执行和多次执行,我们应该使用new MyAsyncTask().execute("");我不明白为什么人们没有给出任何理由而投票。我在第一次搜索时找不到该链接。