Android学习--12-多线程

说说遗留的问题

碎片( Fragment)

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

第8章 多媒体,例子很多。

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

文章都不是写的很详细,就写点要点,防止自己忘记。

后面的问题

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

多线程

java的多线程就不介绍了

Handler

Android 不允许在子线程中进行UI操作

所以Android提供了异步消息处理机制

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

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

输入图片说明

扫描二维码关注公众号,回复: 436760 查看本文章
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();
        }
    }
}

猜你喜欢

转载自my.oschina.net/u/2385255/blog/760650