android异步上传
❶ Android图片批量上传的功能。(图片比较大)
Android中上传图片或者下载图片,使用最多的是xUtils和imageloader、glide,选用这两种的哪一种框架都行,因为是批量和图片大容易造成界面卡以及上传速度慢,对图片操作不当就容易造成OOM异常,一般对于批量上传大图片都需要对图片也处理,然后在上传第一步需要对图片进行比例压缩之后再进行质量压缩,处理之后的图片比之前的图片会小很多,再加上框架的上传处理,会有很好的效果,希望对你有所帮助
❷ Android异步是什么意思
异步就是不同Android设备之间信息不完全一致,比如说你在一台手机上更新了通讯录,同步就是这个新的通讯录信息在你所有设备上同步更新,异步就是只有这一台设备的通讯录更新,其他设备信息不会变动
❸ android上传图片或文件大家都是怎么做的
一:可以使尘启伏用httppost上传文件
二:或者socket写入文件
上面两种都可旁斗以获得二进制流,然后把文件写入流,派携这一类网络操作最好使用异步任务模型
❹ android上传图片到服务端
用Apache的base64的jar包。在手机端转码成base64格式。然后就是一串String。传递到服务端。服务端也用Apache的jar包。进行转码。转成图片就可以了
❺ android中数据上传到服务器怎么实现
服务器端写个servlet,然后在doPost()方法里处理客户端上传的文件,大概代码: DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 1024); // 设置最多只允许在内存中存储的数据, 单位:字节 factory.setRepository(cachepath); // 设置一旦文件大小超过设定值时数据存放的目录 ServletFileUpload srvFileUpload = new ServletFileUpload(factory); srvFileUpload.setSizeMax(1024 * 1024 * 1024); // 设置允许用户上传文件大小, 单位:字节 // 开始读取上传信息 List fileItems = null; try { fileItems = srvFileUpload.parseRequest(request); } catch (Exception e) { System.out.println("获取上传信息。。。。。。失败"); } // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); // 忽略其他不是文件域的所有表单信息 if (!item.isFormField()) { // 取出文件域的所有表单信息 } else { // 取出不是文件域的所有表单信息 } }
❻ android 客户端开发 如何同时上传多张照片
1、在微博页面点击左上角发布按钮后,点击“照相机”标识或“图片”标识;
2、选择图片进行上传,选定后点击右下角的绿色“确认”按钮
3、多图上传最多支持9张图片,如果还需添加可点击“十”字继续选择上传,如果添加完毕可点击右上角的蓝色“发布”即可。
❼ android 文件流的方式多张图片上传,并多个参数
android 开发中图片上传是很正常的,有两种可用的方式:
下面我们就说明一下以文件流上传图片的方式, 实现网络框架是Retrofit
测试上传3张手机sd卡中的图片,并传人了参数EquipmentCode, Description, ReportUserCode等
其中的思路是: Post的方式,Content-Type:multipart/form-data的类型进行上传文件的。
其中MultipartBody是RequestBody的扩展,
看看请求头的信息, 请求中携带了所有信(如果接口开发人员说不能收到, 叫他自己想想,截图给他,哈哈哈:)
上面的是上传了3张图片,如果一张,只要传一个就行!
就这样,图片上传的两种方式ok拉,测试通过的,保证正确!
参考: https://www.jianshu.com/p/acfefb0a204f
❽ android 上传文件需要异步线程吗
一、handler的引入:
我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了。具体实现代码如下:
复制代码
1 package com.example.androidthreadtest;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.widget.Button;
10 import android.widget.TextView;
11
12 public class MainActivity extends Activity implements OnClickListener {
13
14 public static final int UPDATE_TEXT = 1;
15 private TextView text;
16 private Button changeText;
17 private Handler handler = new Handler() {
18 public void handleMessage(Message msg) {
19 switch (msg.what) {
20 case UPDATE_TEXT:
21 text.setText("Nice to meet you");
22 break;
23 default:
24 break;
25 }
26 }
27 };
28
29 @Override
30 protected void onCreate(Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.activity_main);
33 text = (TextView) findViewById(R.id.text);
34 changeText = (Button) findViewById(R.id.change_text);
35 changeText.setOnClickListener(this);
36 }
37
38 @Override
39 public void onClick(View v) {
40 switch (v.getId()) {
41 case R.id.change_text:
42 new Thread(new Runnable() {
43 @Override
44 public void run() {
45 Message message = new Message();
46 message.what = UPDATE_TEXT;
47 handler.sendMessage(message);
48 }
49 }).start();
50 break;
51 default:
52 break;
53 }
54 }
55 }
复制代码
上方第45行代码也可以换成:
Message msg = handler.obtainMessage();
上面的代码中,我们并没有在子线程中直接进行UI操作,而是创建了一个Message对象,并将它的what字段的值指定为了一个整形常量UPDATE_TEXT,用于表示更新TextView这个动作。然后调用Handler的sendMessage()方法将这条Message发送出去。很快,Handler就会收到这条Message,并在handleMessage()方法,在这里对具体的Message进行处理(需要注意的是,此时handleMessage()方法中的代码是在主线程中运行的)。如果发现Message的what字段的值等于UPDATE_TEXT,就将TextView显示的内容更新。运行程序后,点击按钮,TextView就会显示出更新的内容。
二、异步消息处理机制:
Handler是Android类库提供的用于接受、传递和处理消息或Runnable对象的处理类,它结合Message、MessageQueue和Looper类以及当前线程实现了一个消息循环机制,用于实现任务的异步加载和处理。整个异步消息处理流程的示意图如下图所示:
根据上面的图片,我们现在来解析一下异步消息处理机制:
Message:消息体,用于装载需要发送的对象。
handler:它直接继承自Object。作用是:在子线程中发送Message或者Runnable对象到MessageQueue中;在UI线程中接收、处理从MessageQueue分发出来的Message或者Runnable对象。发送消息一般使用Handler的sendMessage()方法,而发出去的消息经过处理后最终会传递到Handler的handlerMessage()方法中。
MessageQueue:用于存放Message或Runnable对象的消息队列。它由对应的Looper对象创建,并由Looper对象管理。每个线程中都只会有一个MessageQueue对象。
Looper:是每个线程中的MessageQueue的管家,循环不断地管理MessageQueue接收和分发Message或Runnable的工作。调用Looper的loop()方法后,就会进入到一个无限循环中然后每当发现MessageQueue中存在一条消息,就会将它取出,并调用Handler的handlerMessage()方法。每个线程中也只会有一个Looper对象。
了解这些之后,我们在来看一下他们之间的联系:
首先要明白的是,Handler和Looper对象是属于线程内部的数据,不过也提供与外部线程的访问接口,Handler就是公开给外部线程的接口,用于线程间的通信。Looper是由系统支持的用于创建和管理MessageQueue的依附于一个线程的循环处理对象,而Handler是用于操作线程内部的消息队列的,所以Handler也必须依附一个线程,而且只能是一个线程。
我们再来对异步消息处理的整个流程梳理一遍:
当应用程序开启时,系统会自动为UI线程创建一个MessageQueue(消息队列)和Looper循环处理对象。首先需要在主线程中创建一个Handler对象,并重写handlerMessage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息就会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,并找到与消息对象对应的Handler对象,然后调用Handler的handleMessage()方法。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行UI操作了。
通俗地来讲,一般我们在实际的开发过程中用的比较多一种情况的就是主线程的Handler将子线程中处理过的耗时操作的结果封装成Message(消息),并将该Message(利用主线程里的MessageQueue和Looper)传递到主线程中,最后主线程再根据传递过来的结果进行相关的UI元素的更新,从而实现任务的异步加载和处理,并达到线程间的通信。
通过上一小节对Handler的一个初步认识后,我们可以很容易总结出Handler的主要用途,下面是Android官网总结的关于Handler类的两个主要用途:
(1)线程间的通信:
在执行较为耗时的操作时,Handler负责将子线程中执行的操作的结果传递到UI线程,然后UI线程再根据传递过来的结果进行相关UI元素的更新。(上面已有说明)
(2)执行定时任务:
指定任务时间,在某个具体时间或某个时间段后执行特定的任务操作,例如使用Handler提供的postDelayed(Runnable r,long delayMillis)方法指定在多久后执行某项操作,比如当当、淘宝、京东和微信等手机客户端的开启界面功能,都是通过Handler定时任务来完成的。
我们接下来讲一下post。
三、post:
对于Handler的Post方式来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()方法。一般在这个run()方法中写入需要在UI线程上的操作。
Post允许把一个Runnable对象入队到消息队列中。它的方法有:post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)。详细解释如下:
boolean post(Runnable r):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,立即执行。
boolean postAtTime(Runnable r,long uptimeMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,在特定的时间执行。
boolean postDelayed(Runnable r,long delayMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,延迟delayMills秒执行
void removeCallbacks(Runnable r):从消息队列中移除一个Runnable对象。
下面通过一个Demo,讲解如何通过Handler的post方式在新启动的线程中修改UI组件的属性:
复制代码
1 package com.example.m03_threadtest01;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.TextView;
9
10 public class MainActivity extends Activity {
11 private Button btnMes1,btnMes2;
12 private TextView tvMessage;
13 // 声明一个Handler对象
14 private static Handler handler=new Handler();
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_main);
20
21 btnMes1=(Button)findViewById(R.id.button1);
22 btnMes2=(Button)findViewById(R.id.button2);
23 tvMessage=(TextView)findViewById(R.id.TextView1);
24 btnMes1.setOnClickListener(new View.OnClickListener() {
25
26 @Override
27 public void onClick(View v) {
28 // 新启动一个子线程
29 new Thread(new Runnable() {
30 @Override
31 public void run() {
32 // tvMessage.setText("...");
33 // 以上操作会报错,无法再子线程中访问UI组件,UI组件的属性必须在UI线程中访问
34 // 使用post方式修改UI组件tvMessage的Text属性
35 handler.post(new Runnable() {
36 @Override
37 public void run() {
38 tvMessage.setText("使用Handler.post在工作线程中发送一段执行到消息队列中,在主线程中执行。");
39 }
40 });
41 }
42 }).start();
43 }
44 });
45
46 btnMes2.setOnClickListener(new View.OnClickListener() {
47
48 @Override
49 public void onClick(View v) {
50 new Thread(new Runnable() {
51 @Override
52 public void run() {
53 // 使用postDelayed方式修改UI组件tvMessage的Text属性值
54 // 并且延迟3S执行
55 handler.postDelayed(new Runnable() {
56
57 @Override
58 public void run() {
59 tvMessage.setText("使用Handler.postDelayed在工作线程中发送一段执行到消息队列中,在主线程中延迟3S执行。");
60
61 }
62 }, 3000);
63 }
64 }).start();
65
66 }
67 });
68 }
69
70 }
复制代码
点击按钮,运行结果如下:
有一点值得注意的是,对于Post方式而言,它其中Runnable对象的run()方法的代码,均执行在UI线程上(虽然是写在子线程当中的),所以对于这段代码而言,不能执行在UI线程上的操作,一样无法使用post方式执行,比如说访问网络。
四、Message:
Handler如果使用sendMessage的方式把消息入队到消息队列中,需要传递一个Message对象,而在Handler中,需要重写handleMessage()方法,用于获取工作线程传递过来的消息,此方法运行在UI线程上。
对于Message对象,一般并不推荐直接使用它的构造方法得到,而是建议通过使用Message.obtain()这个静态的方法或者Handler.obtainMessage()获取。Message.obtain()会从消息池中获取一个Message对象,如果消息池中是空的,才会使用构造方法实例化一个新Message,这样有利于消息资源的利用。并不需要担心消息池中的消息过多,它是有上限的,上限为10个。Handler.obtainMessage()具有多个重载方法,如果查看源码,会发现其实Handler.obtainMessage()在内部也是调用的Message.obtain()。
Handler中,与Message发送消息相关的方法有:
Message obtainMessage():获取一个Message对象。
boolean sendMessage():发送一个Message对象到消息队列中,并在UI线程取到消息后,立即执行。
boolean sendMessageDelayed():发送一个Message对象到消息队列中,在UI线程取到消息后,延迟执行。
boolean sendEmptyMessage(int what):发送一个空的Message对象到队列中,并在UI线程取到消息后,立即执行。
boolean sendEmptyMessageDelayed(int what,long delayMillis):发送一个空Message对象到消息队列中,在UI线程取到消息后,延迟执行。
void removeMessage():从消息队列中移除一个未响应的消息。
❾ 如何在android实现HTTP多任务上传文件
IntentService