今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获。

虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器。不

说废话了,还是写点自己的记录吧!

如果想要实现Android与PHP的交互我们首先应该知道一个叫AsynTask的抽象类。

下面是我的笔记:

为了方便在子线程中对UI进行操作,Android提供了一些好用烦人工具类,AsynTask就是其中之一。借助AsynTask
,可以十分简单地从子线程切换到主线程,它的原理也是基于异步消息处理机制的。
AsynTask的基本用法:
1.AsynTask是一个抽象类,因此使用它必须要创建一个类去继承它。在继承AsynTask时,可以为其指定三个泛型
参数,这三个参数的用途如下所示:
Params:在执行AsynTask时需要传入的参数,用于后台的任务中使用。
Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用该参数作为进度单位。
Result:当任务执行完毕后,如果需要对结果进行返回,则使用该参数作为返回值类型。
例如:class DownLoadTask extends  AsynTask<void,Integer,Boolean>{
              ...

}
通常使用AsynTask时,需要重写它的4个方法。
1.onPreExcute():这个方法在后台任务执行之前调用,一般用于界面上初始化操作,例如,显示一个
进度条对话框等。
2.doInBackground(Params...):这个方法在子线程中运行,用于处理耗时操作,操作一旦完既可以
通过return语句将任务的执行结果返回。如果AsynTask的第三个泛型参数指定的是void则可以不用返回
结果。需要注意的是,这个方法不能进行更新UI操作,如果要在该方法中更新UI可以手动调动
publishProgress(Progress...)方法来完成。
3.onProgressUpdate(Progress...):如果在doInBackground(Params...)方法中调用了publishProgress
(Progress...)方法,这个方法就会很快被调用,方法中携带的参数就是后台任务中传递过来的
在这个方法可以对UI进行操作,利用参数Progress就可以对UI进行相应的更新。
4.onPostExcute(Result):当doInBackground(Params...)执行完毕通过return语句进行返回时,这个
方法会很快被调用。在doInBackground(Params...)中返回的数据会作为参数传递到该方法中。此时
可以利用返回的参数来进行UI操作,例如,提醒某个任务完成了。
package com.itcast.asyntask;

import android.os.AsyncTask;
import android.widget.Toast;

public class DownLoadTask extends AsyncTask<Void,Integer,Boolean>{
    protected void onPreExecute(){
        progressDialog.show();
    }
    
    @Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub
        while(true){
            int downloadPrecent = doDownload();
            publishProgress(downloadPrecent);
            if(downloadPrecent >= 100){
                break;
            }
        }
        
        return true;
    }
    protected void onProgressUpdate(Integer...values){
        progressDialog.setMessage("Download"+values[0]+"%");
    }
    protected void onPostExecute(Boolean result){
        progressDialog.dismiss();
        if(result){
            Toast.makeText(MainActivity.this, "下载成功", 0).show();
        }else{
            Toast.makeText(MainActivity.this, "下载失败", 0).show();
        }
    }

}
要执行DownLoadTask,还需要在UI线程中创建出DownLoadTask的实例,并调用DownLoadTask
实例的Excute()方法。代码如下:
new DownLoadTask().excute();
接下来是我的一个交互的小程序:

步骤为:1.写布局文件  2.写主程序  3.添加网络访问权限

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="上传文件" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:text="TextView" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:text="确定上传" /> </RelativeLayout>
package com.itcastupfile;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL; import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity {
private String uploadFile = "/mnt/sdcard/DCIM/Camera/IMG_20160406_114143.JPG";
private String srcPath = "/mnt/sdcard/DCIM/Camera/IMG_20160406_114143.JPG";
private String actionUrl = "http://10.6.78.90/xampp/sse/index.php/home/Index/upload_file";
private TextView mText1;
private TextView mText2;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText1 = (TextView)findViewById(R.id.textView1);
mText1.setText("文件路径:\n"+uploadFile);
mText2 = (TextView)findViewById(R.id.textView2);
mText2.setText("上传网址:\n"+actionUrl);
mButton = (Button)findViewById(R.id.button1);
mButton.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
uploadFile(actionUrl);
//FileUploadTask fileuploadtask = new FileUploadTask();
//fileuploadtask.execute();
}
});
} private void uploadFile(String actionUrl) {
// TODO Auto-generated method stub
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
try{
URL url = new URL(actionUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃
// 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。
httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K
// 允许输入输出流
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
// 使用POST方法
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(
httpURLConnection.getOutputStream());
dos.writeBytes(twoHyphens + boundary + end);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
+ srcPath.substring(srcPath.lastIndexOf("/") + 1)
+ "\""
+ end);
dos.writeBytes(end); FileInputStream fis = new FileInputStream(srcPath);
byte[] buffer = new byte[8192]; // 8k
int count = 0;
// 读取文件
while ((count = fis.read(buffer)) != -1)
{
dos.write(buffer, 0, count);
}
fis.close(); dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
dos.flush(); InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String result = br.readLine(); Toast.makeText(this, result, Toast.LENGTH_LONG).show();
dos.close();
is.close(); } catch (Exception e)
{
e.printStackTrace();
setTitle(e.getMessage());
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
    <uses-permission android:name="android.permission.INTERNET" />

下面是我的运行结果:

看到的那个Toast就是PHP端的代码,判断是否上传成功!

不过此程序仍然存在问题就是无法显示上传成功,问题还在查询当中。

不过已经算是实现交互的功能了。接下来就是查找上传不成功的原因了。

Android实现与PHP服务器的交互的更多相关文章

  1. android通过HttpClient与服务器JSON交互

    通过昨天对HttpClient的学习,今天封装了HttpClient类 代码如下: package com.tp.soft.util; import java.io.BufferedReader; i ...

  2. Android中webView和网页的交互

     Android中webView和网页的交互 Android中webView跟网页的交互式通过JavaScript进行的.具体步骤: 1.创建JavaScript,在点击的时候调用JavaScript ...

  3. Android SDK 更新镜像服务器

    搞个新的电脑,新环境下,SDK总是更新不成功.找了一下,发现有国内的镜像,记录保存一下. Android Tools Android SDK在线更新镜像服务器    中国科学院开源协会镜像站地址:   ...

  4. 运用socket实现简单的服务器客户端交互

    Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...

  5. 【转】Android 服务器之SFTP服务器上传下载功能

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  6. 使用XML与远程服务器进行交互

    最近在做的一个项目其中的一部分是与远程服务器进行交互,确定身份验证的合法性,于是编写了SendRequest方法 此方法发送给远程服务器XML请求,服务器经过处理后,返回XML回应,由此方法接收到后进 ...

  7. Appcn 移动开发 前台与服务器数据交互

    第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...

  8. 【Android】Android SDK在线更新镜像服务器

    Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/IPV6: http://mi ...

  9. [android]-如何在向服务器发送request时附加已保存的cookie数据

    [android]-如何在向服务器发送request时附加已保存的cookie数据 应用场景:在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务 ...

随机推荐

  1. 第24/24周 数据库维护(Database Maintenance)

    哇哦,光阴似箭!欢迎回到性能调优培训的最后一期.今天我会详细讲下SQL Server里的数据库维护,尤其是索引维护操作,还有如何进行数据库维护. 索引维护 作为一个DBA,数据库维护是你工作中非常重要 ...

  2. chrome dev debug network 的timeline说明

    在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人 ...

  3. 大话ASP.NET开发(第一章 html5+css3+解耦问题的探讨)

    一.拉近我们的距离 我想,很多人会问,如今IE6还占据颇多份额的中国,html5.css3是否还很遥远?我会很直接告诉他们:其实就在你的眼前.我们来看两个图:                      ...

  4. IOS高级编程之三:IOS 多线程编程

    多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...

  5. Javascript对象创建

    一.概述 虽然对象字面量可以用来创建对象,但在创建多个类似的对象时,不够优雅,不符合DRY原则. 二.创建对象 有以下几种模式: 1.工厂模式 2.构造函数模式 3.原型模式 4.组合构造函数和原型模 ...

  6. JAVA - 优雅的记录日志(log4j实战篇)

    写在前面 项目开发中,记录错误日志有以下好处: 方便调试 便于发现系统运行过程中的错误 存储业务数据,便于后期分析 在java中,记录日志有很多种方式: 自己实现 自己写类,将日志数据,以io操作方式 ...

  7. C#进行Visio二次开发之文件导出及另存Web页面

    在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过 ...

  8. jquery列表顺序倒转排序效果

    html文件代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...

  9. C#遍历Dictionary

    C#遍历Dictionary方法 Dictionary<string, int> d = new Dictionary<string, int>(); foreach (Key ...

  10. C#自定义特性实例

    元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1.什么是特性   (1)属性与特性的区别  属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段, ...