1、Handler
主文件:MainActivity.java
package com.example.asynctaskdownload; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { protected static final int SHOW_RESPONSE = 0; /** Called when the activity is first created. */ private TextView textView; private String result = ""; ///////////////////////////////////////////////////////// private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch(msg.what){ case SHOW_RESPONSE: String result = (String)msg.obj; //注意是在此处进行UI操作 textView.setText(result); } } }; ///////////////////////////////////////////////////// @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.TextView01); Button button = (Button) findViewById(R.id.readWebpage); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // //textView.setText(result); if(v.getId() == R.id.readWebpage) { sendRequestHttpUrl(); } } }); } //////////////////////////////////////////////////////// protected void sendRequestHttpUrl() { // TODO Auto-generated method stub // new Thread(new Runnable() { @Override public void run() { // try { HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://10.0.2.2:8080/mp3/a1.lrc"); HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); //关于此处中文乱码问题解决?文本文件保存时,文本文档默认为ANSI编码格式,另存为时手动改为utf-8格式即可 result = EntityUtils.toString(entity, "utf-8"); } Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = result.toString(); handler.sendMessage(message); }catch(Exception ex) { ex.printStackTrace(); } } } ).start(); } }
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/readWebpage" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="Load Webpage" > </Button> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/TextView01" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Placeholder" > </TextView> </ScrollView> </LinearLayout>
运行结果:
2、AnyscTask
主代码:
package com.example.asynctaskdownload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; 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 TextView textView; private final String fileName = "a1.lrc"; //private final String fileUrl = "http://10.0.2.2:8080/mp3/a1.lrc"; private int result = Activity.RESULT_CANCELED; private String response = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.TextView01); Button button = (Button) findViewById(R.id.readWebpage); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // DownloadWebPageTask task = new DownloadWebPageTask(); //task.execute(new String[] { "http://www.vogella.com" }); task.execute(new String[] { "http://10.0.2.2:8080/mp3/a1.lrc" }); Toast.makeText(MainActivity.this, "Download Success!", Toast.LENGTH_LONG).show(); // textView.setText(response); } }); } private class DownloadWebPageTask extends AsyncTask<String, Void, Integer> { @Override protected Integer doInBackground(String... urls) { //获取sdcard的路径,以及设置保存的文件名 File output = new File(Environment.getExternalStorageDirectory(), fileName); if(output.exists()) { output.delete();//若同名文件已存在则删除 } // String response = ""; InputStream content = null; FileOutputStream fos = null; //遍历url数组中的url,采用HttpClient(接口)的方式访问网络 for (String url : urls) { //首先创建一个DefaultHttpClient实例 DefaultHttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url);//发起一个GET请求,创建一个HttpGet对象,并传入目标网络地址 try { HttpResponse execute = client.execute(httpGet);//调用execute执行访问请求并返回一个HttpResponse对象 if(execute.getStatusLine().getStatusCode() == 200) { //注:下面两行code只能使用其中一个:content will be consume only once //execute.getEntity()调用了两次 // content = execute.getEntity().getContent();//获取服务返回的具体内容 //调用EntityUtils.toString该静态方法将HttpEntity转换成字符串,为避免中文字符乱码,添加utf-8字符集参数 // response = EntityUtils.toString(execute.getEntity(), "utf-8"); ////////////////////////////////////////////////////////////////////////////// HttpEntity entity = execute.getEntity(); // response = EntityUtils.toString(entity, "utf-8"); content = entity.getContent(); } //利用管道 inputstream-->reader InputStreamReader reader = new InputStreamReader(content); fos = new FileOutputStream(output.getPath()); int next = -1; while ((next = reader.read()) != -1) { fos.write(next); } result = Activity.RESULT_OK; // BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); // String s = ""; // while ((s = buffer.readLine()) != null) { // response += s; // } } catch (Exception e) { e.printStackTrace(); }finally { if (content != null) { try { content.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } return result; } protected void onPostExecute(Integer result) { //此处可以根据后台任务完成后返回的结果进行一些UI操作 if(result == Activity.RESULT_OK) { textView.setText("mp3 file download success!!"); } } /* public void onClick(View view) { DownloadWebPageTask task = new DownloadWebPageTask(); //task.execute(new String[] { "http://www.vogella.com" }); task.execute(new String[] { "http://10.0.2.2:8080/mp3/a1.lrc" }); }*/ } }
activity_main.xml文件同上
运行结果:成功下载文件a1.lrc到sdcard中