Day10.31作业
单例模式(饿汉式和懒汉式)断点续传布局item的布局网络请求写一个JavaBean的类适配器异步ThreadMain
单例模式(饿汉式和懒汉式)
package com
.example
.app2
;
public class Utils {
public Utils() {
}
private static Utils utils
= null
;
public static Utils
getInstance(){
if (utils
== null
){
synchronized (Object
.class){
if (utils
== null
){
utils
= new Utils();
}
}
}
return utils
;
}
}
断点续传
布局
<?xml version
="1.0" encoding
="utf-8"?>
<RelativeLayout xmlns
:android
="http://schemas.android.com/apk/res/android"
xmlns
:app
="http://schemas.android.com/apk/res-auto"
xmlns
:tools
="http://schemas.android.com/tools"
android
:layout_width
="match_parent"
android
:layout_height
="match_parent"
tools
:context
=".MainActivity">
<ListView
android
:id
="@+id/lv"
android
:layout_width
="match_parent"
android
:layout_height
="match_parent"></ListView
>
<SeekBar
android
:id
="@+id/bar"
android
:layout_width
="match_parent"
android
:layout_height
="20sp"
android
:layout_centerInParent
="true"
android
:visibility
="gone"/>
</RelativeLayout
>
item的布局
<?xml version
="1.0" encoding
="utf-8"?>
<RelativeLayout
xmlns
:android
="http://schemas.android.com/apk/res/android" android
:layout_width
="match_parent"
android
:layout_height
="match_parent">
<ImageView
android
:id
="@+id/zz"
android
:layout_width
="100dp"
android
:layout_height
="100dp"
android
:src
="@mipmap/ic_launcher"
android
:layout_centerInParent
="true"/>
</RelativeLayout
>
网络请求
package com
.example
.day1031
;
import android
.util
.Log
;
import java
.io
.ByteArrayOutputStream
;
import java
.io
.IOException
;
import java
.io
.InputStream
;
import java
.net
.HttpURLConnection
;
import java
.net
.MalformedURLException
;
import java
.net
.URL
;
import java
.net
.URLConnection
;
public class Httputils {
private static final String TAG
= "Httputils";
public static String
geturl(String s
){
try {
URL url
= new URL(s
);
HttpURLConnection connection
= (HttpURLConnection
) url
.openConnection();
connection
.connect();
Log
.i(TAG
, "geturl: "+connection
.getResponseCode());
if (connection
.getResponseCode() == 200){
ByteArrayOutputStream byteArrayOutputStream
= new ByteArrayOutputStream();
InputStream inputStream
= connection
.getInputStream();
int len
= 0;
byte[] bytes
= new byte[1024];
while ((len
= inputStream
.read(bytes
))!=-1){
byteArrayOutputStream
.write(bytes
,0,len
);
}
return byteArrayOutputStream
.toString();
}
} catch (MalformedURLException e
) {
e
.printStackTrace();
} catch (IOException e
) {
}
return null
;
}
}
写一个JavaBean的类
适配器
package com
.example
.day1031
;
import android
.content
.Context
;
import android
.util
.Log
;
import android
.view
.LayoutInflater
;
import android
.view
.View
;
import android
.view
.ViewGroup
;
import android
.widget
.BaseAdapter
;
import android
.widget
.ImageView
;
import com
.bumptech
.glide
.Glide
;
import java
.util
.List
;
public class MyAdapter extends BaseAdapter {
private static final String TAG
= "MyAdapter";
private List
<JavaBean.DataBean> list
;
private Context context
;
private LayoutInflater layoutInflater
;
public MyAdapter(List
<JavaBean.DataBean> list
, Context context
) {
this.list
= list
;
this.context
= context
;
layoutInflater
= LayoutInflater
.from(context
);
}
@Override
public int getCount() {
return list
.size();
}
@Override
public Object
getItem(int position
) {
return list
.get(position
);
}
@Override
public long getItemId(int position
) {
return position
;
}
@Override
public View
getView(int position
, View convertView
, ViewGroup parent
) {
ViewHolder holder
= null
;
if (convertView
== null
){
holder
= new ViewHolder();
convertView
= layoutInflater
.inflate(R
.layout
.layout_item
,null
);
holder
.iv
= convertView
.findViewById(R
.id
.zz
);
convertView
.setTag(holder
);
}else {
holder
= (ViewHolder
) convertView
.getTag();
}
Glide
.with(context
).load(list
.get(position
).getPic()).into(holder
.iv
);
return convertView
;
}
class ViewHolder{
ImageView iv
;
}
}
异步
package com
.example
.day1031
;
import android
.os
.AsyncTask
;
import android
.util
.Log
;
import com
.google
.gson
.Gson
;
import java
.util
.List
;
public class MyAsync extends AsyncTask<String
,Void
, List
<JavaBean.DataBean>> {
private static final String TAG
= "MyAsync";
private List
<JavaBean.DataBean> list
;
private MyAdapter myAdapter
;
public MyAsync(List
<JavaBean.DataBean> list
, MyAdapter myAdapter
) {
this.list
= list
;
this.myAdapter
= myAdapter
;
}
@Override
protected List
<JavaBean.DataBean> doInBackground(String
... strings
) {
String geturl
= Httputils
.geturl(strings
[0]);
Log
.i(TAG
, "doInBackground: "+geturl
);
if (geturl
!= null
){
JavaBean javaBean
= new Gson().fromJson(geturl
, JavaBean
.class);
List
<JavaBean.DataBean> data
= javaBean
.getData();
return data
;
}
return null
;
}
@Override
protected void onPostExecute(List
<JavaBean.DataBean> dataBeans
) {
super.onPostExecute(dataBeans
);
if (dataBeans
!= null
){
list
.addAll(dataBeans
);
myAdapter
.notifyDataSetChanged();
Log
.i(TAG
, "onPostExecute: "+list
.get(1).getTitle());
}
}
}
Thread
package com
.example
.day1031
;
import android
.os
.Handler
;
import android
.os
.Message
;
import android
.util
.Log
;
import java
.io
.File
;
import java
.io
.IOException
;
import java
.io
.InputStream
;
import java
.io
.RandomAccessFile
;
import java
.net
.HttpURLConnection
;
import java
.net
.MalformedURLException
;
import java
.net
.URL
;
import java
.net
.URLConnection
;
public class MyThread extends Thread {
private static final String TAG
= "MyThread";
private String url
;
private String path
;
private Handler handler
;
public MyThread(String url
, String path
, Handler handler
) {
this.url
= url
;
this.path
= path
;
this.handler
= handler
;
}
private long start
= 0;
private long end
;
@Override
public void run() {
try {
URL url
= new URL(this.url
);
HttpURLConnection connection
= (HttpURLConnection
) url
.openConnection();
connection
.connect();
Log
.i(TAG
, "run: "+connection
.getResponseCode());
if (connection
.getResponseCode() == 200){
end
= connection
.getContentLength();
}
} catch (MalformedURLException e
) {
e
.printStackTrace();
} catch (IOException e
) {
e
.printStackTrace();
}
File file
= new File(path
);
if (file
.exists()){
start
= file
.length();
}else {
start
= 0;
}
try {
URL url
= new URL(this.url
);
HttpURLConnection connection
= (HttpURLConnection
) url
.openConnection();
connection
.connect();
Log
.i(TAG
, "run: "+connection
.getResponseCode());
if (connection
.getResponseCode() == 200){
if (start
== end
){
handler
.sendEmptyMessage(200);
}else{
InputStream inputStream
= connection
.getInputStream();
RandomAccessFile rw
= new RandomAccessFile(path
, "rw");
rw
.seek(start
);
long context
= start
;
int len
= 0;
byte[] bytes
= new byte[1024];
while ((len
= inputStream
.read(bytes
))!=-1){
rw
.write(bytes
,0,len
);
context
+=len
;
int progress
= (int) (context
*100/end
);
Message message
= new Message();
message
.what
= 100;
message
.arg1
= progress
;
handler
.sendMessage(message
);
}
}
}
} catch (MalformedURLException e
) {
e
.printStackTrace();
} catch (IOException e
) {
e
.printStackTrace();
}
}
}
Main
package com
.example
.day1031
;
import android
.Manifest
;
import android
.content
.DialogInterface
;
import android
.os
.Build
;
import android
.os
.Handler
;
import android
.os
.Message
;
import android
.support
.v7
.app
.AlertDialog
;
import android
.support
.v7
.app
.AppCompatActivity
;
import android
.os
.Bundle
;
import android
.util
.Log
;
import android
.view
.View
;
import android
.widget
.AdapterView
;
import android
.widget
.ListView
;
import android
.widget
.SeekBar
;
import android
.widget
.Toast
;
import java
.util
.ArrayList
;
import java
.util
.List
;
public class MainActivity extends AppCompatActivity {
private static final String TAG
= "MainActivity";
private ListView lv
;
private SeekBar bar
;
private List
<JavaBean.DataBean> list
= new ArrayList<>();
private String url
="http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1";
private Handler handler
= new Handler(){
@Override
public void handleMessage(Message msg
) {
if (msg
.what
== 100){
bar
.setVisibility(View
.VISIBLE
);
int arg1
= msg
.arg1
;
bar
.setProgress(arg1
);
if (arg1
== bar
.getMax()){
bar
.setVisibility(View
.GONE
);
}
}
if (msg
.what
== 200){
Toast
.makeText(MainActivity
.this, "已经下载", Toast
.LENGTH_SHORT
).show();
}
}
};
private MyAdapter myAdapter
;
@Override
protected void onCreate(Bundle savedInstanceState
) {
super.onCreate(savedInstanceState
);
setContentView(R
.layout
.activity_main
);
lv
= (ListView
) findViewById(R
.id
.lv
);
bar
= (SeekBar
) findViewById(R
.id
.bar
);
if (Build
.VERSION
.SDK_INT
>= Build
.VERSION_CODES
.M
){
requestPermissions(new String[]{Manifest
.permission
.WRITE_EXTERNAL_STORAGE
},100);
}
myAdapter
= new MyAdapter(list
,this);
lv
.setAdapter(myAdapter
);
Async();
lv
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView
<?> parent
, View view
, final int position
, long id
) {
AlertDialog
.Builder builder
= new AlertDialog.Builder(MainActivity
.this);
builder
.setTitle("提示");
builder
.setMessage("是否下载这张图片");
builder
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog
, int which
) {
new MyThread(list
.get(position
).getPic(),"/storage/emulated/0/Movies/"+"pic"+position
+".jpg",handler
).start();
}
});
builder
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog
, int which
) {
Toast
.makeText(MainActivity
.this, "取消", Toast
.LENGTH_SHORT
).show();
}
});
AlertDialog alertDialog
= builder
.create();
alertDialog
.show();
}
});
}
private void Async() {
new MyAsync(list
,myAdapter
).execute(url
);
}
}