提交 9b2e1219 编写于 作者: Black_Hao's avatar Black_Hao

add TimeUtil

add TimeUtil
上级 55211f89
......@@ -25,7 +25,7 @@
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
......
apply plugin: 'com.android.application'
apply from:'../depend.gradle'
android {
compileSdkVersion 26
......@@ -26,6 +27,7 @@ dependencies {
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile gradle.depend["butterknife"]
annotationProcessor gradle.depend["butterknife-compiler"]
compile project(path: ':utillibrary')
}
package com.balckhao.blackhaoutil;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.balckhao.blackhaoutil.base.test.TestActivity;
import com.balckhao.blackhaoutil.mvp.test.MvpTestActivity;
import com.balckhao.blackhaoutil.usbUtil.UsbTestActivity;
import com.blackhao.utillibrary.file.FileUtil;
import com.blackhao.utillibrary.log.LogHelper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MainActivity extends AppCompatActivity {
private File temp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -30,6 +42,76 @@ public class MainActivity extends AppCompatActivity {
case R.id.mvp_base_test:
startActivity(new Intent(this, MvpTestActivity.class));
break;
case R.id.create_temp:
new Thread(new Runnable() {
@Override
public void run() {
String text = "123456789qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" +
"qwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww" +
"ertyuioplkjhgfdsazxcvbbnmnmpoiweqasdjashfasjc nzxkcnahfdasd,as nfasdnask";
try {
temp = FileUtil.getTempFile(MainActivity.this, "aaaa.txt");
FileOutputStream fos = new FileOutputStream(temp);
fos.write(text.getBytes());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
LogHelper.getInstance().e(e.toString());
}
}
}).start();
break;
case R.id.read_temp:
new Thread(new Runnable() {
@Override
public void run() {
try {
FileInputStream fis = new FileInputStream(
temp);
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();
String text = new String(data, "utf-8");
LogHelper.getInstance().e(text);
} catch (Exception e) {
e.printStackTrace();
LogHelper.getInstance().e(e.toString());
}
}
}).start();
break;
case R.id.copy_folder:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//未授权,提起权限申请
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
return;
}
new Thread(new Runnable() {
@Override
public void run() {
String root = Environment.getExternalStorageDirectory().getAbsolutePath();
FileUtil.copyFolder(root + "/QChat", root + "/QChatTest");
LogHelper.getInstance().e("copy finish ");
}
}).start();
break;
case R.id.del_folder:
new Thread(new Runnable() {
@Override
public void run() {
String root = Environment.getExternalStorageDirectory().getAbsolutePath();
FileUtil.delFileBeforeTime(root + "/test", System.currentTimeMillis());
LogHelper.getInstance().e("delete finish ");
}
}).start();
break;
case R.id.rename:
String root = Environment.getExternalStorageDirectory().getAbsolutePath();
FileUtil.modifyFileName(root + "/test", "QChatRename");
break;
}
}
}
package com.balckhao.blackhaoutil.base.test;
import android.os.Bundle;
import android.os.Message;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
......@@ -10,24 +12,27 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.BindView;
/**
* Author : BlackHao
* Time : 2018/8/1 10:35
* Description : BaseActivity LogUtil Test
* Description : BaseActivity LogHelper Test
*/
public class TestActivity extends BaseActivity {
@Bind(R.id.tv_show_time)
TextView tvShowTime;
@BindView(R.id.tv_show_time)
TextView tvShowTime;
@BindView(R.id.frame_1)
FrameLayout frame1;
@BindView(R.id.frame_2)
FrameLayout frame2;
private String testJson1 = "{\"UserID\":01, \"Name\":\"Test\", \"Email\":\"test@gmail.com\"};";
@Override
protected void initUI() {
setContentView(R.layout.activity_base_test);
ButterKnife.bind(this);
butterknife.ButterKnife.bind(this);
//replaceFragment
replaceFragment(R.id.frame_1, new TestFragment());
replaceFragment(R.id.frame_2, new TestFragment());
......@@ -42,7 +47,7 @@ public class TestActivity extends BaseActivity {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 2048; i++) {
sb.append(i).append(" ");
if (i + 1 % 100 == 0) {
if ((i + 1) % 100 == 0) {
sb.append("\n");
}
}
......
......@@ -5,12 +5,10 @@ import android.widget.ImageView;
import android.widget.ListView;
import com.balckhao.blackhaoutil.R;
import com.blackhao.utillibrary.base.BaseFragment;
import java.util.ArrayList;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.BindView;
/**
* Author : BlackHao
......@@ -20,10 +18,11 @@ import butterknife.ButterKnife;
public class TestFragment extends BaseFragment {
@Bind(R.id.iv_1)
@BindView(R.id.iv_1)
ImageView iv1;
@Bind(R.id.lv_test)
@BindView(R.id.lv_test)
ListView lvTest;
butterknife.Unbinder unbinder;
@Override
protected int initLayoutRes() {
......@@ -32,7 +31,7 @@ public class TestFragment extends BaseFragment {
@Override
protected void initUI(View view) {
ButterKnife.bind(this, view);
unbinder = butterknife.ButterKnife.bind(this, view);
iv1.setImageResource(R.mipmap.ic_launcher);
}
......@@ -59,7 +58,7 @@ public class TestFragment extends BaseFragment {
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
}
......@@ -4,13 +4,17 @@ import android.content.Context;
import com.blackhao.utillibrary.mvp.BaseMvpPresenter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Author : BlackHao
* Time : 2018/12/20 10:17
* Description : TestPresenter
*/
public class TestPresenter extends BaseMvpPresenter<TestMvpContract.TestViewImpl> implements TestMvpContract.TestPresenterImpl {
public class TestPresenter extends BaseMvpPresenter<TestMvpContract.TestViewImpl>
implements TestMvpContract.TestPresenterImpl {
public TestPresenter(Context context, TestMvpContract.TestViewImpl mView) {
super(context, mView);
......@@ -19,7 +23,8 @@ public class TestPresenter extends BaseMvpPresenter<TestMvpContract.TestViewImpl
@Override
public void login(final String name, final String psw) {
getView().showLoading("正在登陆...");
new Thread(new Runnable() {
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.execute(new Runnable() {
@Override
public void run() {
//休眠,模拟登陆
......@@ -36,7 +41,7 @@ public class TestPresenter extends BaseMvpPresenter<TestMvpContract.TestViewImpl
}
getView().dismissLoading();
}
}).start();
});
}
@Override
......
......@@ -22,22 +22,20 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.BindView;
public class UsbTestActivity extends AppCompatActivity implements USBBroadCastReceiver.UsbListener {
@Bind(R.id.local_backspace_iv)
@BindView(R.id.local_backspace_iv)
ImageButton localBackspaceIv;
@Bind(R.id.local_file_lv)
@BindView(R.id.local_file_lv)
ListView localFileLv;
@Bind(R.id.usb_backspace_iv)
@BindView(R.id.usb_backspace_iv)
ImageButton usbBackspaceIv;
@Bind(R.id.usb_file_lv)
@BindView(R.id.usb_file_lv)
ListView usbFileLv;
@Bind(R.id.show_progress_tv)
@BindView(R.id.show_progress_tv)
TextView showProgressTv;
//本地文件列表相关
private ArrayList<File> localList;
private FileListAdapter<File> localAdapter;
......@@ -52,7 +50,7 @@ public class UsbTestActivity extends AppCompatActivity implements USBBroadCastRe
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_usb_test);
ButterKnife.bind(this);
butterknife.ButterKnife.bind(this);
initLocalFile();
initUsbFile();
}
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
......@@ -22,7 +23,6 @@
android:id="@+id/log_base_test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="LogUtil/BaseXXX"
......@@ -39,5 +39,68 @@
android:textAllCaps="false" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/create_temp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="CreateTemp"
android:textAllCaps="false" />
<Button
android:id="@+id/read_temp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="ReadTemp"
android:textAllCaps="false" />
<Button
android:id="@+id/copy_folder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="CopyFolder"
android:textAllCaps="false" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/del_folder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="DeleteFolder"
android:textAllCaps="false" />
<Button
android:id="@+id/rename"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="Rename"
android:textAllCaps="false" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
......@@ -3,6 +3,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true"
android:background="#26afcc">
<EditText
......@@ -10,7 +11,6 @@
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:hint="用户名" />
<EditText
......
//定义各类第三方插件的版本号
def gsonVersion = "2.8.5"
def butterknifeVersion = "8.8.1"
def butterknifeCompilerVersion="9.0.0-rc3"
gradle.ext {
depend = [
"gson" : "com.google.code.gson:gson:${gsonVersion}",
"butterknife" : "com.jakewharton:butterknife:${butterknifeVersion}",
"butterknife-compiler": "com.jakewharton:butterknife-compiler:${butterknifeCompilerVersion}"
]
}
//tasks test{
// println("test")
//}
\ No newline at end of file
apply plugin: 'com.android.library'
apply from:'../depend.gradle'
android {
compileSdkVersion 26
......@@ -25,11 +26,9 @@ android {
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support.constraint:constraint-layout:1.1.3'
compile 'com.github.mjdev:libaums:0.5.5'
compile 'io.github.openfeign:feign-gson:9.0.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile gradle.depend["gson"]
}
package com.blackhao.utillibrary.base;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.IdRes;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import com.blackhao.utillibrary.logUtil.LogUtil;
import java.lang.ref.WeakReference;
/**
* Author : 章浩
* Time : 2018/6/20 16:38
* Description : 教育一体机 BaseActivity
*/
public abstract class BaseActivity extends AppCompatActivity {
//Handler
public WeakHandler handler;
//Toast 间隔时间
private static long TOAST_INTERVALS = 1000;
//Toast上次显示时间(避免短时间内多次调用)
private long showToastTime = 0;
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
protected LogUtil log;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//定义全屏参数
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
//获得当前窗体对象
Window window = this.getWindow();
//设置当前窗体为全屏显示
window.setFlags(flag, flag);
//初始化Log
log = LogUtil.getInstance();
//初始化fragmentArray
fragmentArray = new SparseArray<>();
//初始化UI
initUI();
//view 初始化完成
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
//初始化数据
initData();
//添加listener
initListener();
}
});
}
/**
* 初始化UI
*/
protected abstract void initUI();
/**
* UI初始化完成,初始化数据
*/
protected abstract void initData();
/**
* UI初始化完成,初始化接口
*/
protected abstract void initListener();
/**
* 子类要处理 handler的消息,重写该方法
*/
protected abstract void handleMessage(Message msg);
/**
* 初始化 Handler(不用 handler 时,不需要调用该方法)
*/
public void initHandler() {
handler = new WeakHandler(this);
}
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//避免多次调用
if (System.currentTimeMillis() - showToastTime > TOAST_INTERVALS) {
Toast.makeText(BaseActivity.this, str, Toast.LENGTH_SHORT).show();
//更新显示时间
showToastTime = System.currentTimeMillis();
}
}
});
}
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(@StringRes int strId) {
showToast(getString(strId));
}
/**
* 替换 fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(@IdRes int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//用于fragment的显示与隐藏
if (currentFragment != null && currentFragment != showFragment) {
if (!showFragment.isAdded()) { // 先判断是否被add过
transaction.hide(currentFragment).add(frameId, showFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.hide(currentFragment).show(showFragment).commit(); // 隐藏当前的fragment,显示下一个
}
fragmentArray.put(frameId, showFragment);
} else if (currentFragment == null) {
if (!showFragment.isAdded()) { // 先判断是否被add过
transaction.add(frameId, showFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.show(showFragment).commit(); // 隐藏当前的fragment,显示下一个
}
fragmentArray.put(frameId, showFragment);
}
}
/**
* activity 跳转
*
* @param target 需要跳转的 Activity
* @param bundle bundle
* @param isCloseSelf 是否关闭当前的 activity
*/
public void openActivity(Class<?> target, Bundle bundle, boolean isCloseSelf) {
Intent intent = new Intent(this, target);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
if (isCloseSelf) {
finish();
}
}
/**
* activity 跳转(不需要传值)
*
* @param target 需要跳转的Activity
*/
public void openActivity(Class<?> target) {
openActivity(target, null, false);
}
/**
* 弱引用 handler
*/
public static class WeakHandler extends Handler {
WeakReference weakReference;
WeakHandler(BaseActivity activity) {
this.weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
BaseActivity activity = (BaseActivity) weakReference.get();
switch (msg.what) {
default:
if (activity != null) {
activity.handleMessage(msg);
}
break;
}
}
}
}
package com.blackhao.utillibrary.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.blackhao.utillibrary.logUtil.LogUtil;
/**
* Author : BlackHao
* Time : 2018/6/20 14:55
* Description : 教育一体机 BaseFragment
*/
public abstract class BaseFragment extends Fragment {
//对应的activity
protected BaseActivity baseActivity;
//用于保存对应FrameLayout当前显示的Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
protected LogUtil log;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
baseActivity = (BaseActivity) getActivity();
fragmentArray = new SparseArray<>();
log = baseActivity.log;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(initLayoutRes(), container, false);
initUI(view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initData();
initListener();
}
/**
* 用于返回布局文件ID
*/
protected abstract int initLayoutRes();
/**
* UI初始化
*/
protected abstract void initUI(View view);
/**
* UI初始化完成,初始化数据
*/
protected abstract void initData();
/**
* UI初始化完成,初始化接口
*/
protected abstract void initListener();
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(String str) {
baseActivity.showToast(str);
}
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(@StringRes int strId) {
baseActivity.showToast(strId);
}
/**
* 替换fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//用于fragment的显示与隐藏
if (currentFragment != null && currentFragment != showFragment) {
// 先判断是否被add过
if (!showFragment.isAdded()) {
// 隐藏当前的fragment,add下一个到Activity中
transaction.hide(currentFragment).add(frameId, showFragment).commit();
} else {
// 隐藏当前的fragment,显示下一个
transaction.hide(currentFragment).show(showFragment).commit();
}
fragmentArray.put(frameId, showFragment);
} else if (currentFragment == null) {
// 先判断是否被add过
if (!showFragment.isAdded()) {
// 隐藏当前的fragment,add下一个到Activity中
transaction.add(frameId, showFragment).commit();
} else {
// 隐藏当前的fragment,显示下一个
transaction.show(showFragment).commit();
}
fragmentArray.put(frameId, showFragment);
}
}
/**
* activity 跳转
*
* @param target 需要跳转的Activity
* @param bundle bundle
* @param isCloseSelf 是否关闭当前的activity
*/
public void openActivity(Class<?> target, Bundle bundle, boolean isCloseSelf) {
baseActivity.openActivity(target, bundle, isCloseSelf);
}
/**
* activity 跳转(不需要传值)
*
* @param target 需要跳转的 Activity
*/
public void openActivity(Class<?> target) {
openActivity(target, null, false);
}
}
......@@ -7,6 +7,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -19,8 +20,8 @@ public abstract class CommonBaseAdapter<T> extends BaseAdapter {
private List<T> list;
private Context context;
public CommonBaseAdapter(List<T> list, Context context) {
this.list = list;
public CommonBaseAdapter(Context context) {
this.list = new ArrayList<>();
this.context = context;
}
......@@ -30,7 +31,7 @@ public abstract class CommonBaseAdapter<T> extends BaseAdapter {
}
@Override
public Object getItem(int position) {
public T getItem(int position) {
return list.get(position);
}
......@@ -59,6 +60,31 @@ public abstract class CommonBaseAdapter<T> extends BaseAdapter {
return convertView;
}
/**
* 获取上下文对象
*/
public Context getContext() {
return context;
}
/**
* 获取数据
*/
public List<T> getList() {
return list;
}
/**
* 更新数据
*/
public void updateList(List<T> list) {
this.list.clear();
if (list != null && list.size() > 0) {
this.list.addAll(list);
}
notifyDataSetChanged();
}
/**
* 获取 layout 文件
*
......
package com.blackhao.utillibrary.file;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;
import com.blackhao.utillibrary.log.LogHelper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Author : BlackHao
* Time : 2018/4/9 10:10
* Description : 文件工具类
*/
public class FileUtil {
/**
* 获取缓存文件
*
* @param context 上下文对象
* @param fileName 文件名
* @return 文件路径
*/
public static File getTempFile(Context context, String fileName) {
File file = null;
try {
String[] fix = fileName.split("\\.");
String preFix = fix[0];
String sufFix = null;
if (fix.length > 1) {
sufFix = "." + fix[1];
}
String path = context.getCacheDir().getAbsolutePath() + File.separator + "temp";
//判断文件夹是否存在,不存在直接创建
File folder = new File(path);
if (!folder.exists()) {
if (!folder.mkdirs()) {
//创建失败
LogHelper.getInstance().e("create folder " + path + " fail");
return null;
}
}
file = File.createTempFile(preFix, sufFix, folder);
//程序结束自动删除文件(这里好像并没有什么效果,所以需要手动去调用delTempFileBeforeTime)
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
/**
* 删除临时文件夹下,指定时间以前的所有临时文件
*
* @param context 上下文对象
* @param msec 指定时间(毫秒)
*/
public void delTempFileBeforeTime(Context context, long msec) {
String path = context.getCacheDir().getAbsolutePath() + File.separator + "temp";
delFileBeforeTime(path, msec);
}
/**
* 删除文件夹下指定时间以前的所有文件
*
* @param folderPath 文件夹路径
* @param msec 指定时间(毫秒),传 <=0 表示删除所有的文件
*/
public static void delFileBeforeTime(String folderPath, long msec) {
File folder = new File(folderPath);
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isFile() && (msec <= 0 || file.lastModified() < msec)) {
file.delete();
// LogHelper.getInstance().e("delete file :" + file.getAbsolutePath());
} else if (file.isDirectory()) {
delFileBeforeTime(file.getAbsolutePath(), msec);
//这里如果文件夹已经为空,直接删除文件夹
File[] folderFiles = file.listFiles();
if (folderFiles == null || folderFiles.length == 0) {
file.delete();
// LogHelper.getInstance().e("delete folder :" + file.getAbsolutePath());
}
}
}
}
}
}
/**
* 检测文件是否存在
*
* @param path 文件夹路径
*/
public static boolean checkFileExists(String path) {
File file = new File(path);
//判断文件夹是否存在
return file.exists();
}
/**
* 拷贝文件到指定文件夹
*
* @param fromFilePath 文件的绝对路径
* @param toFolder 目标文件夹
*/
public static boolean copyFile(String fromFilePath, String toFolder) {
boolean result = false;
File from = new File(fromFilePath);
File to = new File(toFolder);
if (from.exists() && to.exists() && to.isDirectory()) {
File dst = new File(toFolder + File.separator + from.getName());
if (!dst.exists()) {
try {
dst.createNewFile();
FileInputStream fis = new FileInputStream(from);
FileOutputStream fos = new FileOutputStream(dst);
byte[] data = new byte[10 * 1024];
int len;
while ((len = fis.read(data)) > 0) {
fos.write(data, 0, len);
fos.flush();
}
fos.close();
fis.close();
result = true;
} catch (IOException e) {
LogHelper.getInstance().e("copyFile: " + e.toString());
result = false;
}
}
} else {
result = false;
}
return result;
}
/**
* 拷贝整个文件夹内容到另一个文件夹(只拷贝文件夹内的所有文件)
*
* @param oldPath String 原文件路径
* @param newPath String 复制后路径
*/
public static void copyFolder(String oldPath, String newPath) {
try {
(new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹
File a = new File(oldPath);
String[] file = a.list();
File temp;
for (String aFile : file) {
if (oldPath.endsWith(File.separator)) {
temp = new File(oldPath + aFile);
} else {
temp = new File(oldPath + File.separator + aFile);
}
if (temp.isFile()) {
//如果是文件,直接拷贝
copyFile(temp.getAbsolutePath(), newPath);
} else if (temp.isDirectory()) {
//如果是子文件夹
copyFolder(oldPath + "/" + aFile, newPath + "/" + aFile);
}
}
} catch (Exception e) {
LogHelper.getInstance().e(e.toString());
e.printStackTrace();
}
}
/**
* 删除单个文件
**/
public static boolean delSingleFile(String path) {
File file = new File(path);
return file.exists() && file.isFile() && file.delete();
}
/**
* 修改文件/文件夹名
*
* @param path 文件路径
* @param newName 文件新的名称
*/
public static boolean modifyFileName(String path, String newName) {
File file = new File(path);
if (file.exists()) {
String newPath = file.getParentFile().getAbsolutePath() + File.separator + newName;
return file.renameTo(new File(newPath));
}
return false;
}
/**
* 删除文件夹及其目录下所有文件
*
* @param folderPath 文件夹路径
*/
public static void delFolder(String folderPath) {
try {
delFileBeforeTime(folderPath, 0); //删除完里面所有内容
File myFilePath = new File(folderPath);
myFilePath.delete(); //删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将URI转成绝对路径
*
* @param context 上下文对象
* @param uri URI
* @return 绝对路径
*/
public static String convertUriToPath(Context context, Uri uri) {
if (null == uri) return null;
String scheme = uri.getScheme();
String data = null;
if (scheme == null) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},
null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
/**
* 是否是文本文件
*
* @param s 文件名
*/
public static boolean isTextFile(String s) {
s = s.toLowerCase(); //转成小写的
return s.endsWith(".txt");
}
/**
* 判断是否是图片文件
*
* @return fileName 文件名(文件路径)
*/
public static boolean isImageFile(String fileName) {
fileName = fileName.toLowerCase(); //转成小写的
return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")
|| fileName.endsWith(".png");
}
/**
* 判断是否是 Office 文件
*
* @return fileName 文件名(文件路径)
*/
public static boolean isOfficeFile(String fileName) {
fileName = fileName.toLowerCase(); //转成小写的
return fileName.endsWith(".doc") || fileName.endsWith(".ppt") || fileName.endsWith(".xls")
|| fileName.endsWith(".docx") || fileName.endsWith(".pptx") || fileName.endsWith(".xlsx");
}
/**
* 判断是否是视频文件
*
* @return fileName 文件名(文件路径)
*/
public static boolean isVideoFile(String fileName) {
fileName = fileName.toLowerCase(); //转成小写的
return fileName.endsWith(".mp4") || fileName.endsWith(".flv");
}
/**
* 获取指定文件夹的文件列表
*
* @param path 文件夹列表
*/
public static List<File> getFolderFile(String path) {
List<File> list = new ArrayList<>();
File file = new File(path);
if (!file.exists()) {
//不存在则创建文件夹
file.mkdirs();
}
if (file.isDirectory()) {
File[] fileList = file.listFiles();
if (fileList != null && fileList.length > 0) {
Collections.addAll(list, fileList);
}
}
return list;
}
/**
* 获取 sdcard 可用空间的大小
*
* @return 可用空间
*/
public static long getUseableSize() {
File path = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(path.getPath());
long blockSize;
long freeBlocks;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
blockSize = sf.getBlockSizeLong();
freeBlocks = sf.getAvailableBlocksLong();
// return freeBlocks * blockSize; //单位Byte
// return (freeBlocks * blockSize)/1024; //单位KB
return (freeBlocks * blockSize) / 1024 / 1024; // 单位MB
} else {
return -1;
}
}
}
package com.blackhao.utillibrary.logUtil;
package com.blackhao.utillibrary.log;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import com.blackhao.utillibrary.BuildConfig;
import com.blackhao.utillibrary.time.TimeUtil;
import java.io.File;
import java.io.FileWriter;
/**
* Author : BlackHao
* Time : 2017/8/1 14:05
* Description : Log 工具类 ,支持跳转对应的代码位置
*/
public class LogUtil {
public class LogHelper {
//单例
private static LogUtil logUtil;
private static LogHelper logUtil;
//打印等级(这里用于release版本打印)
private static int LOG_LEVEL = Log.ERROR;
//打印调试开关
private static boolean IS_DEBUG = true;
//Log 单打印的最大长度
private static boolean IS_DEBUG = BuildConfig.DEBUG;
//Log 单打印的最大长度
private static final int MAX_LENGTH = 3 * 1024;
//是否需要写文件
private static final boolean IS_WRITE_FILE = true;
//文件路径
private static String LOG_FILE_PATH;
//单例模式初始化
public static LogUtil getInstance() {
public static LogHelper getInstance() {
if (logUtil == null) {
logUtil = new LogUtil();
logUtil = new LogHelper();
}
return logUtil;
}
/**
* 初始化 LOG_FILE
*/
public void initLogFile(Context context) {
if (context != null) {
LOG_FILE_PATH = context.getCacheDir().getAbsolutePath() + File.separator + "QChatLog";
}
}
/**
* 获取 TAG 信息:文件名以及行数
*
......@@ -36,7 +60,9 @@ public class LogUtil {
}
for (StackTraceElement st : sts) {
//筛选获取需要打印的TAG
if (!st.isNativeMethod() && !st.getClassName().equals(Thread.class.getName()) && !st.getClassName().equals(this.getClass().getName())) {
if (!st.isNativeMethod()
&& !st.getClassName().equals(Thread.class.getName())
&& !st.getClassName().equals(this.getClass().getName())) {
//获取文件名以及打印的行数
tag.append("(").append(st.getFileName()).append(":").append(st.getLineNumber()).append(")");
return tag.toString();
......@@ -51,9 +77,14 @@ public class LogUtil {
* @param text 需要打印的内容
*/
public synchronized void e(String text) {
if (IS_DEBUG) {
if (IS_DEBUG || Log.ERROR >= LOG_LEVEL) {
if (TextUtils.isEmpty(text)) {
Log.e(getTAG(), "Log Error text is null");
return;
}
for (String str : splitStr(text)) {
Log.e(getTAG(), str);
writeLog("ERROR : " + getTAG() + " : " + str);
}
}
}
......@@ -64,9 +95,10 @@ public class LogUtil {
* @param text 需要打印的内容
*/
public synchronized void d(String text) {
if (IS_DEBUG) {
if (IS_DEBUG || Log.DEBUG >= LOG_LEVEL) {
for (String str : splitStr(text)) {
Log.d(getTAG(), str);
writeLog("DEBUG : " + getTAG() + " : " + str);
}
}
}
......@@ -77,9 +109,10 @@ public class LogUtil {
* @param text 需要打印的内容
*/
public synchronized void w(String text) {
if (IS_DEBUG) {
if (IS_DEBUG || Log.WARN >= LOG_LEVEL) {
for (String str : splitStr(text)) {
Log.w(getTAG(), str);
writeLog("WARN : " + getTAG() + " : " + str);
}
}
}
......@@ -90,9 +123,10 @@ public class LogUtil {
* @param text 需要打印的内容
*/
public synchronized void i(String text) {
if (IS_DEBUG) {
if (IS_DEBUG || Log.INFO >= LOG_LEVEL) {
for (String str : splitStr(text)) {
Log.i(getTAG(), str);
writeLog("INFO : " + getTAG() + " : " + str);
}
}
}
......@@ -103,7 +137,7 @@ public class LogUtil {
* @param json 需要打印的内容
*/
public synchronized void json(String json) {
if (IS_DEBUG) {
if (IS_DEBUG || Log.ERROR >= LOG_LEVEL) {
String tag = getTAG();
try {
//转化后的数据
......@@ -157,7 +191,7 @@ public class LogUtil {
if (null == jsonStr || "".equals(jsonStr))
return "";
StringBuilder sb = new StringBuilder();
char last = '\0';
char last;
char current = '\0';
int indent = 0;
boolean isInQuotationMarks = false;
......@@ -217,4 +251,32 @@ public class LogUtil {
sb.append('\t');
}
}
}
/**
* 将 log 写入文件
*
* @param log 需要写入文件的 log
*/
private void writeLog(String log) {
try {
if (!IS_WRITE_FILE) {
return;
}
if (LOG_FILE_PATH != null && LOG_FILE_PATH.length() > 0) {
File folder = new File(LOG_FILE_PATH);
if (folder.exists() || folder.mkdirs()) {
//文件夹存在或者创建文件夹成功
String file = LOG_FILE_PATH + File.separator + TimeUtil.getCurrentTime("yyyy-MM-dd") + ".txt";
File logFile = new File(file);
if (logFile.exists() || logFile.createNewFile()) {
FileWriter writer = new FileWriter(logFile, true);
writer.write(log + "\n");
writer.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package com.blackhao.utillibrary.mvp;
/**
* Author : BlackHao
* Time : 2019/4/8 09:11
* Description : 空白的 activity,主要用于不使用 MVP 模式的情况
*/
public abstract class BaseActivity extends BaseMvpActivity<BlankContract.PresenterImpl>
implements BlankContract.ViewImpl{
@Override
public int getStatusMode() {
return TRANSLUCENT_STATUS;
}
@Override
protected BlankContract.PresenterImpl initPresenter() {
return null;
}
}
package com.blackhao.utillibrary.mvp;
import android.view.View;
/**
* Author : BlackHao
* Time : 2019/4/8 09:11
* Description : 空白的 Fragment,主要用于不使用 MVP 模式的情况
*/
public abstract class BaseFragment extends BaseMvpFragment<BlankContract.PresenterImpl>
implements BlankContract.ViewImpl, View.OnClickListener {
@Override
protected BlankContract.PresenterImpl initPresenter() {
return null;
}
}
......@@ -17,7 +17,7 @@ import android.view.View;
import android.widget.Toast;
import com.blackhao.utillibrary.base.LoadingDialog;
import com.blackhao.utillibrary.logUtil.LogUtil;
import com.blackhao.utillibrary.log.LogHelper;
import java.lang.ref.WeakReference;
......@@ -27,14 +27,15 @@ import java.lang.ref.WeakReference;
* Description : Base MVP Activity
*/
public abstract class BaseMvpActivity<T extends BaseMvpPresenterImpl> extends AppCompatActivity implements BaseMvpViewImpl {
public abstract class BaseMvpActivity<T extends BaseMvpPresenterImpl> extends AppCompatActivity
implements BaseMvpViewImpl {
//Handler
public WeakHandler handler;
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
public LogUtil log;
//LogHelper
public LogHelper log;
//加载框
private LoadingDialog loadingDialog;
// Presenter
......@@ -62,7 +63,7 @@ public abstract class BaseMvpActivity<T extends BaseMvpPresenterImpl> extends Ap
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化Log
log = LogUtil.getInstance();
log = LogHelper.getInstance();
//初始化fragmentArray
fragmentArray = new SparseArray<>();
//
......
......@@ -12,7 +12,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.blackhao.utillibrary.logUtil.LogUtil;
import com.blackhao.utillibrary.log.LogHelper;
/**
* Author : BlackHao
......@@ -24,11 +24,10 @@ public abstract class BaseMvpFragment<T extends BaseMvpPresenterImpl> extends Fr
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
public LogUtil log;
//LogHelper
public LogHelper log;
// Presenter
private T mPresenter;
//Activity
private T mPresenter; //Activity
private BaseMvpActivity activity;
@Override
......
package com.blackhao.utillibrary.mvp;
/**
* Author : BlackHao
* Time : 2018/12/20 10:16
* Description : 空白 ViewImpl,PresenterImpl。
*/
public class BlankContract {
public interface ViewImpl extends BaseMvpViewImpl {
}
public interface PresenterImpl extends BaseMvpPresenterImpl {
}
}
package com.blackhao.utillibrary.time;
import android.text.format.Time;
import android.util.Log;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
/**
* Author : BlackHao
* Time : 2016/8/13 14:05
* Description : 时间类型转换工具类
*/
public class TimeUtil {
/**
* 默认的时间 String 模式
*/
private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 获取当前时间,并返回 String类型的数据
*
* @return 当前时间
*/
public static String getCurrentTime() {
return getCurrentTime(DEFAULT_PATTERN);
}
/**
* 获取当前时间,并返回 String类型的数据
*
* @return 当前时间
*/
public static String getCurrentTime(String pattern) {
String currentTime;
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
SimpleDateFormat formatter;
formatter = new SimpleDateFormat(pattern, Locale.CHINA);
currentTime = formatter.format(curDate);
return currentTime;
}
/**
* 通过传入的 Date类型时间,并返回String类型的数据
*/
public static String formatDateToString(Date curDate, String pattern) {
String time;
SimpleDateFormat formatter;
formatter = new SimpleDateFormat(pattern, Locale.CHINA);
time = formatter.format(curDate);
return time;
}
/**
* 通过传入的 Date类型时间,并返回 String类型的数据
*/
public static String formatDateToString(Date curDate) {
return formatDateToString(curDate, DEFAULT_PATTERN);
}
/**
* 根据毫秒数返回年月日时分秒
*/
public static int[] formatMsecToTimeInfo(long msec) {
int[] dates = new int[6];
Time t = new Time();
t.set(msec);
dates[0] = t.year;
dates[1] = t.month + 1;
dates[2] = t.monthDay;
dates[3] = t.hour;
dates[4] = t.minute;
dates[5] = t.second;
return dates;
}
/**
* 通过枚举来返回当前的 int类型的时间类型(年,月,日,时,分,秒,周几)
*/
public static int getTimeType(long msec, TimeType type) {
int time = 0;
Time t = new Time();
t.set(msec); // 取得当前系统时间
switch (type) {
case YEAR:
time = t.year;
break;
case MONTH:
time = t.month;
break;
case DAY:
time = t.monthDay;
break;
case HOUR:
time = t.hour;
break;
case MINUTE:
time = t.minute;
break;
case SECOND:
time = t.second;
break;
case WEEKDAY:
time = t.weekDay;
break;
}
return time;
}
public enum TimeType {
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, WEEKDAY
}
/**
* 将 String("yyyy-MM-dd HH:mm:ss")转换成 Date
*/
public static Date formatStrToDate(String str) {
return formatStrToDate(str, DEFAULT_PATTERN);
}
/**
* 将 String转换成 Date
*/
public static Date formatStrToDate(String str, String pattern) {
Date date;
try {
SimpleDateFormat formatter = new SimpleDateFormat(pattern, Locale.CHINA);
date = formatter.parse(str);
return date;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将毫秒转化成固定格式的时间
*/
public static String formatMsecToString(long msec) {
return formatMsecToString(msec, DEFAULT_PATTERN);
}
/**
* 将毫秒转化成固定格式的时间
*/
public static String formatMsecToString(long msec, String pattern) {
Date date = new Date();
try {
date.setTime(msec);
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.CHINA);
return sdf.format(date);
}
/**
* 将字符串转化成毫秒
*/
public static long formatStringToMsec(String str, String pattern) {
Calendar c = Calendar.getInstance();
try {
c.setTime(new SimpleDateFormat(pattern, Locale.CHINA).parse(str));
return c.getTimeInMillis();
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
/**
* 将字符串转化成毫秒
*/
public static long formatStringToMsec(String str) {
return formatStringToMsec(str, DEFAULT_PATTERN);
}
/**
* 毫秒转成 时:分:秒
*/
public static String formatMsec(long ms) {
int ss = 1000;
int mi = ss * 60;
int hh = mi * 60;
long hour = ms / hh;
long minute = (ms - hour * hh) / mi;
long second = (ms - hour * hh - minute * mi) / ss;
String strHour = hour < 10 ? "0" + hour : "" + hour;//小时
String strMinute = minute < 10 ? "0" + minute : "" + minute;//分钟
String strSecond = second < 10 ? "0" + second : "" + second;//秒
return strHour + ":" + strMinute + ":" + strSecond;
}
/**
* 判断日期是否在两个指定日期之内
*
* @param targetDate 需要判断的日期
* @param startDate 开始日期
* @param endDate 结束日期
* @param pattern 时间模式
*/
public static boolean isBetweenTwoDays(String targetDate, String startDate, String endDate, String pattern) {
SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.CHINA);
try {
Date dt1 = df.parse(startDate);
Date dt2 = df.parse(endDate);
Date target = df.parse(targetDate);
return dt1.getTime() <= target.getTime() && dt2.getTime() >= target.getTime();
} catch (Exception exception) {
exception.printStackTrace();
}
return false;
}
/**
* 判断日期是否在两个指定日期之内
*
* @param targetDate 需要判断的日期
* @param startDate 开始日期
* @param endDate 结束日期
*/
public static boolean isBetweenTwoDays(String targetDate, String startDate, String endDate) {
return isBetweenTwoDays(targetDate, startDate, endDate, DEFAULT_PATTERN);
}
/**
* 获取指定网站的日期时间(必须在子线程调用),用于获取网络时间
*/
public static long getWebsiteTime() {
try {
String webUrl[] = {"http://www.bjtime.cn", //bjTime
"http://www.baidu.com", //百度
"http://www.taobao.com",//淘宝
"http://www.ntsc.ac.cn", //中国科学院国家授时中心
"http://www.time.ac.cn/"};
for (String aWebUrl : webUrl) {
URL url = new URL(aWebUrl);// 取得资源对象
URLConnection uc = url.openConnection();// 生成连接对象
uc.setConnectTimeout(5 * 1000);
uc.connect();// 发出连接
// 读取网站日期时间
if (uc.getDate() > formatStringToMsec("2016-01-01 00:00:00")) {
//只有网络时间大于2016/1/1才表示时间正常
return uc.getDate();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return -1;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册