【已解决】Android中在新线程中调用Toast.makeText导致程序崩溃

【问题】

之前虽然已经实现了,可以通过在新建的线程中,及时动态更新进度条的问题了:

【已解决】Android中的进度条,虽然设置了setProgress但是也不更新,直到最后完成时,突然更新为100%

但是结果却在:

?
1
Toast.makeText(getApplicationContext(),  "歌曲下载完毕" , Toast.LENGTH_SHORT).show();

的位置,导致程序崩溃。

【解决过程】

1.参考:

Posting Toast message from a Thread

发现,好像要去实现,不同线程之间的,send message。

所以去试试。

结果是,用了如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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.再去参考:

http://developer.android.com/intl/zh-CN/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

去直接使用

//progressBarHandler.post(downloadComplete);

runOnUiThread(downloadComplete);

结果还是不行。

3.结果后来才发现,原来之前使用:

progressBarHandler.post(downloadComplete);

runOnUiThread(downloadComplete);

以及:

?
1
2
3
4
5
6
7
final Runnable downloadComplete =  new Runnable() {
     //@Override
     public void run() {
         Toast.makeText(getApplicationContext(),  "歌曲下载完毕" , Toast.LENGTH_SHORT).show();
         pgbDownload.setProgress( 0 );
     }
};

?
1
2
3
4
5
6
7
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。


转自:https://www.crifan.com/android_new_thread_toast_maketext_creash/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值