app简介
这是一款基于eclipse编辑的简单图片查看器,包含异步下载网络资源、listView的显示、sqlite数据操作等的一些简单的功能;主要操作:点击添加按钮,弹出对话框,向对话框中添加正确图片资源网址以及自定义标题名,就可开启异步线程下载文件,下载后保存在到本地的同时将文件目录名以及自定义的标题名、网址等信息会自定保存到数据库中,并在ListView中自动显示相关数据;在ListView控件长按可以弹出对话判断是否删除文件或者可点击删除按钮将ListView的item删除,同时也会删除数据库的数据;关于图片的文件的删除,删除数据库时会判断有没有其他标题在引用该图片,如果没有则删除…
运行效果
功能介绍
1. 自定义简单的布局、按钮图形设计
2. BaseAdapter 自定义适配器的简单实现
3. ListView、Button 等控件事件的实现
4. AsyncTask 异步下载网络图片并保存到本地中
5. AlertdDialog、ProgressDialog等对话的框的实现
6. ContentProvider、SQLiteOpenhelper数据库相关以及数据库增、删、改、差等基本功能的实现
7. 偏好设置、接口回调等其他实现
代码各个模块主要代码的实现
异步代码快+接口回调的实现
从MainActivity中传进网址,
//创建一个外部异步线程
public class MyTask extends AsyncTask<String, Integer, String> {
String imageName;
// 接口回调
interface CallBack {
// onProgressUpdate方法中使用,参数表示下载图片的大小,这里没有去实现,主要用于开启一个下载的进度对话框
public void start(int leng);
// 结束线程的时候调用,用于关闭开启的进度对话框
public void end();
// 结束时,船体数据,其实可以跟end()方法一起实现的
public void getImage_path(String FileName);
}
CallBack callBack;
public MyTask(String imageName, CallBack callBack) {
this.callBack = callBack;
this.imageName = imageName + ".jpg";
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
callBack.end();
callBack.getImage_path(result);
}
// 进度回调
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
callBack.start(values[0]);
}
// **下载资源文件(异步线程核心代码)**
protected String doInBackground(String... params) {
// 开启网路下载
HttpURLConnection connection = null;
//获取外部存储路径
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath();
//创建文件对象
File file = new File(path, imageName);
// 保存文件到本地种
try {
//创建连接
connection = (HttpURLConnection) new URL(params[0]).openConnection();
publishProgress(5);
//创建缓冲输入流,获得网络连接的输入流
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
//创建输出流
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
int len = 0;
//文件的读写操作
byte[] buff = new byte[2048];
while ((len = bis.read(buff)) != -1) {
bos.write(buff, 0, len);
}
bis.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();
}
// 将保存文件的绝对地址返回
return file.getAbsolutePath().toString();
}
}
AlertdDialog对话的框的主要代码
// 添加数据..按钮点击事件
public void addMessage(View v) {
// Toast.makeText(this, "xxx", 0).show();
tv_first.setVisibility(View.GONE);
// 找到自定义的布局文件,转化为view
View view = LayoutInflater.from(this).inflate(R.layout.dialog, null);
// 创建一个自定义对话框,判断是否加载图片
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 添加自定义的view
builder.setView(view);
Button btn_ok = (Button) view.findViewById(R.id.btn_item_ok);
Button btn_cancel = (Button) view.findViewById(R.id.btn_item_cancel);
final EditText et_name = (EditText) view.findViewById(R.id.et_name);
final EditText et_image = (EditText) view.findViewById(R.id.et_image);
dialog = builder.create();
dialog.show();
// 点击确定
btn_ok.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 判断输入是否为空是否为空,如果为空则报错,并返回重新输入
if (et_image.getText().toString().equals("")
|| et_image == null) {
et_name.setError("网址不能为空");
return;
}
if (et_name.getText().toString().equals("") || et_name == null) {
et_image.setError("标题不能为空");
return;
}
// 判断是否需要下载 true为需要下载
boolean isdown = isDownImage(et_name.getText().toString(),
et_image.getText().toString());
if (isdown) {
// 启动异步线程
MyTask task = new MyTask(et_name.getText().toString(),
// 接口回调
new CallBack() {
public void getImage_path(String fileName) {
Bean bean = new Bean();
bean.imge_path = fileName;
bean.title = et_name.getText().toString();
data.add(bean);
adapter.notifyDataSetChanged();
// 调用方法 添加到数据库中
insert(et_name.getText().toString(),
bean.imge_path, et_image.getText()
.toString());
}
@Override
public void start(int leng) {
setDownDialog(5);
}
@Override
public void end() {
closeDialog();
}
});
task.execute(et_image.getText().toString());
}
dialog.dismiss();
}
});
// 点击取消,返回
// ........................................................................
btn_cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
}
数据库ContentProvider的主要代码
// 数据库添加数据
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = db.insert(TABLE, null, values);
Uri uri2 = ContentUris.withAppendedId(uri, id);
if (id != -1) {
Log.d("msg", id + "数据插入成功............................");
} else {
Log.d("msg", id + "数据插入成功............................");
}
return uri2;
}
// 数据库删除数据
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int delete = db.delete(TABLE, selection, selectionArgs);
return 0;
}
// 更新数据
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int update = db.update(TABLE, values, selection, selectionArgs);
return 0;
}
程序第一次运行的实—-现偏好设置
// 偏好设置 判断是否为第一次运行
SharedPreferences sf = getSharedPreferences("fi.txt", MODE_PRIVATE);
boolean isFirst = sf.getBoolean("isfirst", true);
// 判断是否为第一次
if (isFirst) {
Editor edit = sf.edit();
edit.putBoolean("isfirst", false);
edit.commit();
} else {
tv_first.setVisibility(View.GONE);
}
自定义适配器的实现
//获取
public View getView(int position, View convertView, ViewGroup parent) {
ViewHeler heler;
if (convertView == null) {
heler = new ViewHeler();
convertView = inflater.inflate(R.layout.list_item, null);
heler.imageView = (ImageView) convertView
.findViewById(R.id.iv_image);
heler.textView = (TextView) convertView.findViewById(R.id.tv_titl);
convertView.setTag(heler);
} else {
heler = (ViewHeler) convertView.getTag();
}
heler.textView.setText(list.get(position).title);
try {
Log.i("msg", list.get(position).imge_path+"..........................");
FileInputStream in = new FileInputStream(
list.get(position).imge_path);
heler.imageView.setImageBitmap(BitmapFactory.decodeStream(in));
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return convertView;
}
class ViewHeler {
ImageView imageView;
TextView textView;
}