最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

Android crifan 6641浏览 0评论

【问题】

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

【已解决】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.再去参考:

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);

以及:

	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。

转载请注明:在路上 » 【已解决】Android中在新线程中调用Toast.makeText导致程序崩溃

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.164 seconds, using 22.09MB memory