精华内容
下载资源
问答
  • Android开发 多线程网络请求

    千次阅读 2016-07-17 10:44:51
    Android 开发 多线程网络请求 @Gust @Date 2016-07-17 介绍   Android开发中,通过网络请求服务器是必要的一部分,开发原则中有两条* 主线程不做UI之外的操作 * 其他线程不操作UI   开始的时候,我想主线程...

    Android 开发 多线程网络请求

    @Gust
    @Date 2016-07-17


    介绍

      Android开发中,通过网络请求服务器是必要的一部分,开发原则中有两条

    * 主线程不做UI之外的操作
    * 其他线程不操作UI
    

      开始的时候,我想主线程需要等待请求结果,就直接把网络请求写在了主线程内,结果报出

    android.os.NetworkOnMainThreadException 异常
    

      于是想到用多线程解决,还有 Android端访问本机服务器的时候,地址用 http://10.0.2.2

    启动线程

        String url = "http://10.0.2.2:8001/wregister";//URL地址
                    String post = "name=" + person.getName() + "&password=" + person.getPassword()
                            + "&email=" + person.getEmail() + "&phone=" + person.getPassword() +
                            "&address=" + person.getAddress() + "&prefer=" +person.getPrefer() +
                            "&sign=" + person.getSign();//请求内容
    
                    UThread th = new UThread(url, post);//新建线程
                    th.start();//启动
                    try {
                        th.join();//主线程需要等待子线程,于是用 jion() 方法
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("这是得到的请求  " + th.getResult() );
    

    线程

    
        public class UThread extends Thread implements Runnable {
    
            String url;
            String post;
            String result;
            public UThread(String u, String p) {
                url = u;
                post = p;
            }
            @Override
            public void run() {
                String str = PostUtils.sendPost(url, post);
                result = str;
                System.out.println("这是得到的请求  " + str);
            }
    
            public String getResult() {
                return result;
            }
        }
    

    HTTP 请求

    
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.PrintWriter;
        import java.net.URL;
        import java.net.URLConnection;
        import java.util.List;
        import java.util.Map;
    
        public class PostUtils {
            /**
             * 向指定URL发送GET方法的请求
             *
             * @param url
             *            发送请求的URL
             * @param param
             *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
             * @return URL 所代表远程资源的响应结果
             */
            public static String sendGet(String url, String param) {
                String result = "";
                BufferedReader in = null;
                try {
                    String urlNameString = url + "?" + param;
                    URL realUrl = new URL(urlNameString);
                    // 打开和URL之间的连接
                    URLConnection connection = realUrl.openConnection();
                    // 设置通用的请求属性
                    connection.setRequestProperty("accept", "*/*");
                    connection.setRequestProperty("connection", "Keep-Alive");
                    connection.setRequestProperty("user-agent",
                            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    // 建立实际的连接
                    connection.connect();
                    // 获取所有响应头字段
                    Map<String, List<String>> map = connection.getHeaderFields();
                    // 遍历所有的响应头字段
                    for (String key : map.keySet()) {
                        System.out.println(key + "--->" + map.get(key));
                    }
                    // 定义 BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(new InputStreamReader(
                            connection.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
                } catch (Exception e) {
                    System.out.println("发送GET请求出现异常!" + e);
                    e.printStackTrace();
                }
                // 使用finally块来关闭输入流
                finally {
                    try {
                        if (in != null) {
                            in.close();
                        }
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
                return result;
            }
    
            /**
             * 向指定 URL 发送POST方法的请求
             *
             * @param url
             *            发送请求的 URL
             * @param param
             *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
             * @return 所代表远程资源的响应结果
             */
            public static String sendPost(String url, String param) {
                PrintWriter out = null;
                BufferedReader in = null;
                String result = "";
                try {
                    URL realUrl = new URL(url);
                    // 打开和URL之间的连接
                    URLConnection conn = realUrl.openConnection();
                    // 设置通用的请求属性
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    conn.setRequestProperty("user-agent",
                            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    // 发送POST请求必须设置如下两行
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    // 获取URLConnection对象对应的输出流
                    out = new PrintWriter(conn.getOutputStream());
                    // 发送请求参数
                    out.print(param);
                    // flush输出流的缓冲
                    out.flush();
                    // 定义BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
                } catch (Exception e) {
                    System.out.println("发送 POST 请求出现异常!"+e);
                    e.printStackTrace();
                }
                //使用finally块来关闭输出流、输入流
                finally{
                    try{
                        if(out!=null){
                            out.close();
                        }
                        if(in!=null){
                            in.close();
                        }
                    }
                    catch(IOException ex){
                        ex.printStackTrace();
                    }
                }
                return result;
            }
        }

    附其他解决方法

    异步发送网络请求 android.os.NetworkOnMainThreadException 异常处理

    展开全文
  • 1 概述在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的...

    1 概述

    在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

    如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信

    Android是单线程模型,意味着android ui操作并水是线程安全的,并且这些操作必须在UI线程中执行,所以你单纯的new一个thread是不行的,因为这违背了android的单线程模型,怎样用好多线程呢

    原则 : 所有可能耗时的操作都放在其它线程去处理。

    2 Android几种多线程的实现方式(四种)

    A 、Activity.runOnUiThread(Runnable)

    B、View.post(Runnable) ;View.postDelay(Runnable , long)

    C、Handler

    D、AsyncTask

    AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行,对于开发 者而言,它屏蔽掉了多线程和后面要讲的Handler的概念。你不了解怎么处理线程间通讯也没有关系,AsyncTask体贴的帮你做好了。使用他你会发 现你的代码很容易被理解,因为他们都有一些具有特定职责的方法,尤其是AsyncTask,有预处理的方法onPreExecute,有后台执行任务的方 法doInBackground,有更新进度的方法publishProgress,有返回结果的方法onPostExecute等等,这就不像post 这些方法,把所有的操作都写在一个Runnable里。不过封装越好越高级的API,对初级程序员反而越不利,就是你不了解它的原理。当你需要面对更加复 杂的情况,而高级API无法完成得很好时,你就杯具了。所以,我们也要掌握功能更强大,更自由的与Main线程通讯的方法:Handler的使用。

    3 总结

    A 、Android系统是单线程系统,为了实现多线程的效果,采用message queue

    B、 为了实现多线程,可采用runOnUiThread, handler , AsyncTask , post 技术实现

    展开全文
  • 问题之一是多线程问题,项目比较小,用到多线程的地方不多。但是这里还是写一下。话不多说先上代码。 package com.ldx.mutiplethread import android.annotation.SuppressLint import androidx.appcompat.app....

    最近论文的事情也整完了,想起之前项目中有遗留的问题,解决一下。
    问题之一是多线程问题,项目比较小,用到多线程的地方不多。但是这里还是写一下。话不多说先上代码。

    package com.ldx.mutiplethread
    
    import android.annotation.SuppressLint
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.os.Handler
    import android.os.Message
    import android.widget.Toast
    import com.tamsiree.rxkit.RxTool
    import com.tamsiree.rxui.view.RxProgressBar
    import kotlinx.android.synthetic.main.activity_main.*
    import java.lang.Exception
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            RxTool.init(this)
            progressBar.setProgress(20.0F)
            btn.setOnClickListener {
                Toast.makeText(this, "开始获取数据并显示", Toast.LENGTH_SHORT).show()
                startThread()
            }
            btnOther.setOnClickListener {
                Toast.makeText(this,"更新UI界面",Toast.LENGTH_SHORT).show()
                progressBar.setProgress(progressBar.getProgress()+20.0F)
            }
        }
    
        override fun onBackPressed() {
            super.onBackPressed()
            Toast.makeText(this,"点击了返回键",Toast.LENGTH_SHORT).show()
        }
        val handler = @SuppressLint("HandlerLeak")
        object : Handler() {
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when (msg.what) {
                    UPDATE_MSG1 -> {
                        tvFirstMessage.text = "耗时${Integer.parseInt(msg.obj.toString())/1000}s,这是显示的第一条数据"
                        progressBar.setProgress(60.0F)
                    }
                    UPDATE_MSG2 -> {
                        tvSecondMessage.text = "耗时${Integer.parseInt(msg.obj.toString())/1000}s,这是显示的第二条数据"
                        progressBar.setProgress(80.0F)
                    }
                }
            }
        }
        val UPDATE_MSG1 = 1000
        val UPDATE_MSG2 = 2000
        private fun startThread() {
            val thread1 = Thread(Runnable {
                var sleetTime = (3..8).random() * 1000L
                try {
                    Thread.sleep(sleetTime)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
                val msg = Message()
                msg.what = UPDATE_MSG1
                msg.obj = sleetTime
                handler.sendMessage(msg)
            })
            val thread2=Thread(Runnable {
                var sleetTime = (8..13).random() * 1000L
                try {
                    Thread.sleep(sleetTime)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
                val msg = Message()
                msg.obj = sleetTime
                msg.what = UPDATE_MSG2
                handler.sendMessage(msg)
            })
            thread1.start()
            thread2.start()
        }
    }
    
    

    demo由两个界面构成,用于模拟进入新界面加载数据的过程,demo中包含一个progressbar,进入界面时进度条便有20%的进度,两个子线程采用随机数的形势先后模拟加载数据,获取其他数据button,是为了证明当子线程获取数据的时候,依然可以对UI进行操作。
    其中progressbar 为自定义View,暴露出来的接口为加载数据时进度条的颜色loadingColor及加载完成进度条的颜色stopColor等。具体大家可以下载源码再研究。
    然后,点击模拟器中的返回键,是为了验证,在获取数据的时候,依然可以取消获取数据,返回上一界面。
    代码链接:代码
    积分设置我也改不了,需要demo 的可以点赞关注+私聊(附邮箱)我发给你。

    展开全文
  • 学习安卓开发,需要学习很多相关的知识,在学习多线程编程及消息机制前,先对多线程以及多线程编程做下了解。多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在...

    学习安卓开发,需要学习很多相关的知识,在学习多线程编程及消息机制前,先对多线程以及多线程编程做下了解。多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。而在Android的应用程序中其支持多线程,然而多线程编程为我们充分利用系统资源提供了便利,同时也为设计复杂UI和耗时操作提供了途径,提升了安卓用户的使用体验。

    84953f577dc653e482befdee9701bfa2.png

    在安卓应用开发中,会经常遇到需要多线程技术的时候,比如UI显示和数据处理分开。

    在现实的应用中经常会遇到这种场景,需要我们新开一个线程来监听数据状态,比如数据的状态的改变、接收和发送等等,那么当发现数据状态改变时通知主线程,这个通知主要是通过消息机制发送消息到主线程,在主线程接收到通知之后进行处理(自定义消息处理接口)。

    具体实现如下:

    准备线程的创建和消息的处理,在线程的创建以及消息的处理时需要使用到android里面的Handler和Thread类这两个类,在主线程中添加两个成员Handler、Thread,并实现消息的发送和处理:

    private Handler handler = new Handler(){

    @Override

    public void handleMessage(Message msg) {

    // TODO Auto-generated method stub

    switch(msg.what){

    case 0:

    //添加自定义消息处理

    //...

    break;

    default:break;

    }

    }

    };

    private Thread MagCardDataListenThread = new Thread(new Runnable(){

    @Override

    public void run() {

    // TODO Auto-generated method stub

    while(isMagCardRunning){

    try{

    Thread.currentThread().sleep(1000);

    //状态改变时发送消息到主线程

    if(magcard.IsGetMagCardData()){

    Message msg = new Message();

    msg.what = 0;

    handler.sendMessage(msg);

    }

    }catch(InterruptedException e){

    e.printStackTrace();

    }

    }

    }

    });

    启动子线程

    MagCardDataListenThread.start();

    上文对于线程的创建和消息的处理只需要两步就可以完成一个多线程的框架搭了。在这个过程中需要利用到的两个类Handler和Thread,在这里就不一一说明了,自行了解。

    展开全文
  • Android开发多线程断点续传下载器

    万次阅读 多人点赞 2011-10-01 23:14:36
    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线、电量不足等情况下,这就需要使用到断点...
  • AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行,对于开发 者而言,它屏蔽掉了多线程和后面要讲的Handler的概念。你不了解怎么处理线程间通讯也没有...
  • 详细介绍按照得多线程开发,handler消息机制,AsyncTask(异步操作),访问网络,访问sql sever 数据库。从网络上获取图片等开发所需基础知识,简单异动,照顾新手
  • 安卓开发多线程精讲一学就会 大学计算机专业毕业,从业IT四年,擅长java,...
  • 8.5.3 线程同步案例 图8-4 多线程同步实现计算值 Android移动应用开发实用教程 8 Android多线程 第 章 本章内容 8.1 Android线程简介 8.2 循环者消息Looper-Message机制 8.3 AsyncTask类 8.4 Android其它创建多线程...
  • 介绍四种Android开发多线程的操作方式
  • Android多线程开发

    2019-05-17 16:11:45
    Android多线程开发线程(Thread)相关概念Android中常见线程实现Thread的方式线程相关重要方法线程安全停止线程线程优先级 线程(Thread)相关概念         进程...
  • Android多线程开发总结

    千次阅读 2020-01-16 09:16:48
    多线程开发Android技术中非常重要,能否熟练掌握这些技术是衡量一个工程师技术水平能力的一个重要标准,也是决定能否开发出高效优质应用的前提条件。下面将分别展开描述以及对比,并结合实际工作场合分析优劣。...
  • Android开发过程中,多线程真的很难吗?多线程程序的“麻烦”源于它很抽象、与单线程程序运行模式不同,但只要掌握了它们的区别,编写多线程程序就会很容易了。下面让我们集中精力开始学习吧!我在给我的学生讲...
  • Android多线程开发解析

    2019-01-27 17:55:04
    多线程的概念 怎么使用多线程开发 多线程开发的场景
  • 对于这种可以同时进行的任务,可以用线程来表示,每个线程完成一个任务,并与其它线程同时执行,这种机制被称为多线程。下面介绍如何创建、开启、休眠和停止线程。 1.创建线程 两种方法 a.通过Thread类的构造方法...
  • 可以动态设置线程个数,用于android初学者多线程断点下载参考使用,资源为源码包
  • Android 多线程 为什么要多线程开发?  因为默认的我们的任务是在主线程(UI线程)这一单线程模式下执行的,如果主线程执行过于繁重,耗时的操作时,将会阻塞线程, 一旦线程被阻塞,将无法分派任何事件,...
  • android多线程开发

    千次阅读 2018-09-20 11:47:33
    1.多线程开发 1)多线程开发目的 2)多线程开发注意点 2.工作线程类型 1)Thread 2)intentService 3)handlerThread 4)AsyncTask 5)线程池 a、FixedTreadPool: b、CachedThreadPool: c、...
  • Android多线程之Handler 前言  Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,...
  • 1.线程的创建 创建一个Thread类,或者创建一个Thread子的对象; 创建一个Runnable接口的类对象;
  • Android开发过程中为什么要多线程我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长...
  • Android Studio 多线程开发简单示例

    千次阅读 2019-10-16 10:00:48
    这篇博客的主要目的是备忘,记录一下我知道的三种多线程使用方式。 第一种:使用匿名类实现Runnable接口的方式(推荐) new Thread(new Runnable() { // 匿名类的Runnable接口 @Override public void run() { ...
  • Android开发多线程处理
  • 主要介绍了Android编程开发实现多线程断点续传下载器,涉及Android多线程,文件传输及断点续传的相关技巧,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,886
精华内容 54,354
关键字:

安卓开发多线程