Category: Android

Android学习笔记:ProgressDialog与多线程

在UI的线程中执行需要花费一些时间的后台操作,比如下载数据,会导致UI线程拖慢对用户操作做出响应。超过一段时间没有响应的Activity会被Android操作系统报告给用户,并询问用户希望结束程序还是继续等待。这显然是我们不希望的,后台的操作不应该导致前台操作被拖延。(想象一下,如果你用UI线程执行下载1GB数据的工作,那么在下载结束之前,用户甚至都没有点暂停的机会) Java中一般解决这种问题的思路是是用Thread来创建新的线程执行后台操作,但这样在Android里面行不通。因为不允许在非UI线程上执行调用影响UI显示的函数,比如关闭对话框。官方对此的解释是,因为Android UI不是线程安全的,在非UI上执行UI操作会有concurrency的问题。Android为此提供了一个新的方法来解决这个问题,叫做AsyncTask。 通过重载AsyncTask的一些函数,我们可以在后台执行操作,并且在执行完成后在UI线程上执行另外的操作。以下是一个显示进度对话框,并执行后台任务,完成后关闭进度对话框的例子。 private ProgressDialog dialog; // 此处省略这个class其他的函数 private void doSomething() { dialog = ProgressDialog.show(this, “wait”, “something is in progress”); dialog.setCancelable(false);   //如果不希望用户在执行过程中用返回键关闭这个窗口,设置此项 new backgroundWorker().execute(param);     //这里的param后面会发送给AsyncTask的doInBackground函数 …… } private void backgroundDone() { dialog.dismiss(); } class backgroundWorker extends AsyncTask<Integer, Void, Boolean> { //这三项分别是param,progress,result的类型,注意这里不能用int而要使用Integer,因为Integer是int的class版。Void也是一个道理 //三个类型具体可以根据实际情况选择,这里我们只是举例。 //doInBackground的参数类型必须是param的类型,返回值必须是result的类型 @Override protected Boolean doInBackground(Integer… params) { //这里的param就是刚才execute传入的参数 //do Read More

Android学习笔记:关于getInstance

Android的Activity是主要的UI显示框架,相当于Java的JFrame。但是Activity类的初始化并不是我们操作的,只有onCreate重载函数可以初始化Activity。这样一来就不能像Java中那样进行Model实例的传递。getInstance就成为了解决这个问题的方法。 我们知道,在Java中,被声明为static的函数和变量是可以在全局访问的,所有的实例都可以访问到同样的数据。我们只要把Model的实例放在一个static的变量上,就可以随时访问了。 public class model { private static model instance = null; protected model() { // initiate model } public static model getInstance() { if(instance == null) instance = new model(); return instance; } } 以上代码演示了一个getInstance的例子。无论在任何地方调用model.getInstance()函数,返回的永远是同一个instance的实例。这样就可以保证程序的数据统一稳定了。   Read More