概述
【问题】
之前虽然已经实现了,可以通过在新建的线程中,及时动态更新进度条的问题了:
【已解决】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/
最后
以上就是寂寞奇迹为你收集整理的【已解决】Android中在新线程中调用Toast.makeText导致程序崩溃的全部内容,希望文章能够帮你解决【已解决】Android中在新线程中调用Toast.makeText导致程序崩溃所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复