Android学习--12-多线程

说说遗留的问题

碎片( Fragment)java

第4章 看得挺头疼,没弄明白,不写了。多线程

第8章 多媒体,例子不少。异步

对于像我同样的初学者来讲,这书入门挺好,建议购买,网上也有此书每章的源码。ide

文章都不是写的很详细,就写点要点,防止本身忘记。oop

后面的问题

粗看比较快,在看书中的天气实例。 码云weatherSimple,后续有空会写实例步骤。线程

多线程

java的多线程就不介绍了code

Handler

Android 不容许在子线程中进行UI操做对象

因此Android提供了异步消息处理机制继承

异步消息,应该有哪些组成?队列

  1. 消息 Message
  2. 处理消息 Handler
  3. 消息队列 MessageQueue
  4. 管理消息队列 Looper

输入图片说明

public class MainActivity extends Activity implements OnClickListener {
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Button changeText;
    private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case UPDATE_TEXT:
        // 在这里能够进行UI操做
            text.setText("Nice to meet you");
            break;
        default:
            break;
        }
    }
};
……
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.change_text:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Message message = new Message();
                    message.what = UPDATE_TEXT;
                    handler.sendMessage(message); // 将Message对象发送出去
                }    
        }).start();
            break;
        default:
            break;
        }
    }
}

使用AsyncTask

使用方法 继承AsyncTask

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    ……
}

而后启动 new DownloadTask().execute();

四个能够重写的方法:

  1. onPreExecute() 前执行
  2. doInBackground(Params...) 执行中,不能够对UI进行操做 ,但能够 publishProgress()来切换到UI 线程
  3. onProgressUpdate(Progress...) 执行中,能够对UI进行操做
  4. onPostExecute(Result) 执行完后
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        progressDialog.show(); // 显示进度对话框
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            while (true) {
                int downloadPercent = doDownload(); // 这是一个虚构的方法
                publishProgress(downloadPercent);
                if (downloadPercent >= 100) {
                    break;
                }        
          }
    } catch (Exception e) {
        return false;
    }
    return true;
}

    @Override
    protected void onProgressUpdate(Integer... values) {
        // 在这里更新下载进度
        progressDialog.setMessage("Downloaded " + values[0] + "%");
    }
    @Override
    protected void onPostExecute(Boolean result) {
        progressDialog.dismiss(); // 关闭进度对话框
        // 在这里提示下载结果
        if (result) {
            Toast.makeText(context, "Download succeeded",
            Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, " Download failed",
            Toast.LENGTH_SHORT).show();
        }
    }
}
相关文章
相关标签/搜索