我使用工作线程从URL中读取文本。我的帖子如下。在第一次运行时,我确信线程运行已完成,因为我可以检查sdcard_readstr
是null
。
在第二次运行时,当我调用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图像已附加。
答案 0 :(得分:3)
我的解决方案是here 。我不能在第二次重用Thread
对象的相同实例。我需要创建一个新实例,以便在第二次调用Thread
。所以Thread适合单次运行的进程,对于多次运行的进程,我应该使用AsyncTask
。即使AsyncTack
仅用于一次执行和多次执行,我们应该使用new MyAsyncTask().execute("");
我不明白为什么人们没有给出任何理由而投票。我在第一次搜索时找不到该链接。