1、服务器后台使用Servlet开发,这里不再介绍。
2、网络开发不要忘记在配置文件中添加访问网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
3、网络请求、处理不能在主线程中进行,一定要在子线程中进行。因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的。(主线程应该只进行UI绘制,像网络请求、资源下载、各种耗时操作都应该放到子线程中)。
4、传输大文件的时候会出现OOM出错,所以我们可以设置每次传输流的大小。
5、
public class FileActivity extends Activity { private TextView mTvMsg; private String result = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_file); initView(); } private void initView(){ mTvMsg = (TextView) findViewById(R.id.tv_msg); new Thread(fileThread).start(); } private Thread fileThread = new Thread(){ public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://192.168.23.1:8080/TestProject/FileTest"); connection = (HttpURLConnection) url.openConnection(); // 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃 // 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP请求正文的流。 connection.setChunkedStreamingMode(51200); // 128K // 不使用缓存 connection.setUseCaches(false); // 设置请求方式 connection.setRequestMethod("POST"); // 设置编码格式 connection.setRequestProperty("Charset", "UTF-8"); // 设置容许输出 connection.setDoOutput(true); // 上传文件 FileInputStream file = new FileInputStream(Environment.getExternalStorageDirectory().getPath() + "/aaaaa/baidu_map.apk"); OutputStream os = connection.getOutputStream(); byte[] b = new byte[1024]; int count = 0; while((count = file.read(b)) != -1){ os.write(b, 0, count); } os.flush(); os.close(); // 获取返回数据 if(connection.getResponseCode() == 200){ InputStream is = connection.getInputStream(); result = StringStreamUtil.inputStreamToString(is); Message msg = Message.obtain(); msg.what = 0; fileHandler.sendMessage(msg); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if(connection != null){ connection.disconnect(); } } }; }; private Handler fileHandler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what == 0 && result!=null){ mTvMsg.setText(result); } }; }; }
6、输出流OutputStream的三个方法,第二和第三个方法应该是安全的,但第一个方法可能出现错误。因为你没读1024字节,却写了1024字节,所以可能出错。(我试了几次是出错的,也可能是我代码写错了,但我建议大家还是不要使用第一个方法)。
os.write(byte[] buffer);
os.write(int arg0);
os.write(byte[] buffer, int offset, int count);
时间: 2024-10-04 17:10:32