【问题】
之前虽然已经实现了,可以通过在新建的线程中,及时动态更新进度条的问题了:
【已解决】Android中的进度条,虽然设置了setProgress但是也不更新,直到最后完成时,突然更新为100%
但是结果却在:
Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show();
的位置,导致程序崩溃。
【解决过程】
1.参考:
Posting Toast message from a Thread
发现,好像要去实现,不同线程之间的,send message。
所以去试试。
结果是,用了如下代码:
package crifan.com.downloadsongtastemusic; import java.io.File; import java.io.IOException; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.StrictMode; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.ProgressBar; //import android.widget.TextView; import android.widget.Toast; import android.content.Intent; public class MainActivity extends Activity { private ProgressBar pgbDownload; private int downloadedPercent = 0; public static final int maxPercent = 100; private Handler progressBarHandler = new Handler(); /** Called when the user clicks the Download button */ public void preformDownload(View view) { ...... try { fullFilename.createNewFile(); fullFilename.setWritable(Boolean.TRUE); // Start lengthy operation in a background thread new Thread(new Runnable() { public void run() { crifanLib.UpdateProgressCallback updateProgressCallback = new crifanLib.UpdateProgressCallback() { public void updateProgress(long currentSize, long totalSize){ downloadedPercent = (int)((currentSize * 100) / totalSize); pgbDownload.setProgress(downloadedPercent); if(downloadedPercent >= maxPercent) { progressBarHandler.post(downloadComplete); } } }; songtaste.stDownloadFromUrl(strSongUrl, fullFilename, updateProgressCallback); } }).start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } final Runnable downloadComplete = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show(); pgbDownload.setProgress(0); } }; }
始终都还是无法执行到:
Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show();
所以,还是没搞懂,到底如何才能执行到UI线程中的Toast
2.再去参考:
去直接使用
//progressBarHandler.post(downloadComplete);
runOnUiThread(downloadComplete);
结果还是不行。
3.结果后来才发现,原来之前使用:
progressBarHandler.post(downloadComplete);
或
runOnUiThread(downloadComplete);
以及:
final Runnable downloadComplete = new Runnable() { //@Override public void run() { Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show(); pgbDownload.setProgress(0); } };
或
final Runnable downloadComplete = new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show(); pgbDownload.setProgress(0); } };
结果,其实都是可以正常运行的。
只不过,调试时,给
Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show();
打断点,是无法执行到的。
很是诡异。
【总结】
再次验证了,Eclipse/ADT中的调试,是多么的烂,竟然没有“继续运行”,最多只有函数返回的F7,导致调试很不方便。
至少,此处无法很顺利很方便的,调试执行到Toast.makeText。