Android开发之afinal框架笔记

 更新时间:2016年9月20日 19:59  点击:1326
afinal框架是一个android的 orm 和 ioc 框架。而且封装了android中的httpClient,使其更加简单易用。 afinal是android应用开发的终极框架.

afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少。
在android应用开发中,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm框架,无需任何配置信息,一行代码就可以对android的sqlite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。

Afinal里面目前包含了四大组件:


FinalHttp:用于请求http数据,直接ajax方式请求,文件上传, 断点续传下载文件等
FinalBitmap:用于显示bitmap图片,而无需考虑线程并发和oom等问题。
FinalActivity:完全可以通过注解方式绑定控件和事件,无需编写代码。
FinalDb:android中sqlite的orm框架,一行代码搞定增删改查。

小结

无论是学习哪个框架,入手一般的顺序都是如下:

1、学习该框架,会用。

2、精通如何使用该框架(基于框架抛出来的接口设计自己优秀的应用)

3、阅读框架代码,自己画uml图

4、尝试自己写一些小框架。

5、自己写的框架和你认为优秀的框架对比。

智能手机像电脑一样可以安装大量的应用软件与游戏,这样因为手机空间没有电脑空间大并且智能手机也会产生缓存,这样久了缓存不清除手机就越用越慢了,下面我们来看看常用解决智能手机内存空间不足的方法。

空间不足怎么办

1.系统提示内存空间不足了之后,卸载程序也不会增加多少可用空间,仍然会提示系统内存不足,亲测通过格式化手机可以解决,也就是恢复出厂设置(恢复出厂设置会把所有应用都卸载回到最初界面)。当然这个方法也会让你安装的APP都丢失,如果没必要刷机就再看看下面的。

2.打开RE文件浏览器,将/data/dalvik-cache 这个文件夹里面的都是系统缓存文件和卸载定制程序留下来的无用垃圾,可以放心全部删除,系统所需文件重启后能自动生成的,删除后可以感觉到系统内存明显提升,RAM内存释放,重启期间等待时间一到两分钟,期间不要有任何操作。小编实测有效,不过发现锁屏变成默认的

3.我们需要用到RE管理器进行删除(需要root权限)。

1、打开RE管理器(第一次打开RE管理器时,系统会弹出窗口询问你是否允许re管理器获取root权限,点击允许即可)

2、打开RE管理器后,点击右上角”挂载读写“的按钮;

3、进入data/app文件夹,找到该目录下的后缀为odex的文件,删除即可!

4、删除之后,再次安装就不会再出现“存储空间不足”了!不信你试试!

安卓教程:使用RE管理器解决“存储空间不足” - 解决安装特定应用出现的“存储空间不足”问题-7

安卓教程:使用RE管理器解决“存储空间不足” - 解决安装特定应用出现的“存储空间不足”问题-5

4.移动APP到SD卡,这个方法有一定的局限性,当效果不错,部分手机不支持者这样的功能

5.使用容量较小的主题包,由于使用的主题都是要求放置在机身内存中的,所以使用小容量的主题包也能很有效的减少内存占用。

内存不足怎么办

1、系统提示内存不足解决办法一,可以删除一些不用的程序但这样空间不会有多大的提升,我们可以恢复出厂设置也就是大家讲的格机了:

2、在手机中安装RE文件器,然后进入你手机的/data/dalvik-cache 这里面是你手机应用程序所产生的临时文件与缓存文件了,清除这里不要的文件可解决此问题。

3、把一些不要的系统文件删除,但是删除后第一次重启机器会比较慢,大概2分钟才可启动

在安卓应用开发中碰到1. 4.0 或以上版本的 Android 不能在主线程中联网与 自定义 touch 创建左右划动检测两个问题,下面我找到解决办法了下面大家一起来看看。

继续整理一下做 Android 开发过程中遇到的一些问题和技巧。

1. 4.0 或以上版本的 Android 不能在主线程中联网
Android 应用程序运行在一个 dalvik 虚拟机进程中,当这个进程开始的时候会启动一个主线程( MainThread ),在 Android 4.0 或以上的版本中,强制禁止在主线程执行耗时的网络操作,若需要进行网络操作,则需要另外开辟线程或使用 AsyncTask ,下面介绍的是另外开辟线程的方法。

 代码如下 复制代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single);
 
    new Thread(postLoad).start();
 
}
     
Runnable postLoad = new Runnable(){
           
    @Override
    public void run() {  
        // TODO Auto-generated method stub  
        // 在这里执行联网操作
    }
};

但是,联网操作后一般都需要根据联网所得数据更新 UI ,这时又会产生一个新问题,主线程负责处理和 UI 相关的操作,因此主线程又被称为 UI 线程。而 Android 采用 UI 单线程模型,只能在主线程中对 UI 元素进行操作,在非 UI 线程直接对 UI 进行了操作,则会报错。

为了解决这个问题,则需要利用 Android 的消息循环的机制实现线程间的通信。即在非 UI 线程发送消息到 UI 线程,让 UI 线程来进行 UI 的操作。例如,可以利用 View 的 post 方法告知 UI 线程执行操作更新 UI 。

 代码如下 复制代码

Runnable postLoad = new Runnable(){
           
    @Override
    public void run() {  
        // TODO Auto-generated method stub
        // 联网获取数据 data
        TextView textShow = (TextView) findViewById(R.id.show);
        textShow.post(new Runnable() {
               
            @Override
            public void run() { // 该方法会在 ui 线程执行 
                textShow.setText(data);
            }
        });
    }
};

2. 检测是否有网络

 代码如下 复制代码

final ConnectivityManager mConnectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// 检查网络连接,如果无网络可用,就不需要进行连网操作等 
NetworkInfo info = mConnectivity.getActiveNetworkInfo();    
if (info != null ) { // 若有网络
    // 判断网络连接类型
    int netType = info.getType(); 
    int netSubtype = info.getSubtype(); 
 
    if (netType == ConnectivityManager.TYPE_WIFI) { 
        // 若为 WIFI
    } else if (netType == ConnectivityManager.TYPE_MOBILE && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS ) { 
        // 若为 3G
    } else { 
        // 其他网络
    }
} else { // 若无网络
 
}

3. 自定义 touch 创建左右划动检测

     

 代码如下 复制代码
// 定义手势速度记录器
private VelocityTracker velocityTracker;
// 定义手势动作两点之间的距离要求
private static final int VELOCITYX = 900;
private static final int VELOCITYY = 800;
 
WebView postContent = (WebView) findViewById(R.id.postContent);
 
postContent.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
         // TODO Auto-generated method stub
             
        switch(arg1.getAction()){
        case MotionEvent.ACTION_DOWN:
            if(velocityTracker == null){
                // 取得手势在屏幕上的滑动速度
            velocityTracker = VelocityTracker.obtain();
            velocityTracker.addMovement(arg1);
        }
        break;
    case MotionEvent.ACTION_MOVE:
        if(velocityTracker != null){
            velocityTracker.addMovement(arg1);
        }
        break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_OUTSIDE:
            break;
        case MotionEvent.ACTION_UP:
 
        int velocityX = 0, velocityY = 0;
 
        if(velocityTracker != null){
            velocityTracker.addMovement(arg1);
            velocityTracker.computeCurrentVelocity(1000); // 计算每秒滑动多少个像素
            velocityX = (int) velocityTracker.getXVelocity(); // 最后计算检索 X 速度
            velocityY = (int) velocityTracker.getYVelocity(); // 最后计算检索 Y 速度
        }
 
            // 从右向左划
        if( velocityX < -VELOCITYX && velocityY < VELOCITYY && velocityY > -VELOCITYY ){
                // 执行相应操作
                return true;
            } else if( velocityX > VELOCITYX && velocityY < VELOCITYY && velocityY > -VELOCITYY ) { // 从左向右划
                // 执行相应操作
                return true;
            } else {
                // 判断若不是划动操作,则返回 false 使用 WebView 自身的 touch 处理
                return false;
            }
                 
        }
        return false;
    }
});

在检测过程中发现触摸操作不完整(例如划动距离太少,或者误触屏幕),或是直接判断出不是划动操作,必须返回 false ,使到组件自身的 touch 处理得以保留。

下面我整理了自己在android开发时碰到的一些小问题,包括有Missing contentDescription attribute on image in XML与Buttons in button bars should be borderless问题。

最近在做 Android 开发,刚刚入门,遇到不少问题,累积了做重构时的习惯,遇到问题,好好解决,好好总结,于是整理如下:

一. Eclipse Error
1.'Missing contentDescription attribute on image' in XML
原因:缺少图片描述,在 ADT 16 开始会抛出这个警告,确保开发者为图片添加内容描述。

解决方法:为图片添加 android:contentDescription="@string/desc" 属性。

2. Buttons in button bars should be borderless
原因:两个 Buttons 放在一个布局里会被判断为按钮栏,需要添加样式取消它的边框。

解决方法: 在 Buttons 上添加属性 style="?android:attr/buttonBarButtonStyle" 。系统提示也可以在按钮的父布局上添加 style="? android:attr/buttonBarStyle" 属性,但是我在线性布局上测试了一下无效,求高手指导!

二. 开发技巧
1. 在新打开的 Activity 中触发前一个 Activity 作出调整
例如:原页面相应的 class 为 Main.class (主要代码)

 代码如下 复制代码

public class Main extends Activity {
 
    Button page;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        page = (Button) findViewById(R.id.open);
 
        page.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View source) {
                Intent intent = new Intent(Main.this, NewPage.class);
 
                // 启动 intent 对应的 Activity ,并且等待其返回结果,其中 0 是标识码
                startActivityForResult(intent, 0);
            }
        });
     
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent){
         
        if( requestCode == 0 && resultCode == 0 ){ // 确认请求标识码和反馈结果标识码同为 0
            // 改变本页面或其他操作
        }
    }
 
}

public class NewPage extends Activity {
 
    Button cancel;
 
    Intent intent;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newpage);
         
        // 获取到上一个页面传过来的 Intent
        intent = this.getIntent();
 
        cancel = (Button) findViewById(R.id.confirm);
        cancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View source) {
                // 反馈结果,将 intent 传回上一个 Activity ,这时在上一页触发 onActivityResult 方法,重写该方法可以对原页面作出调整
                NewPage.this.setResult(0, intent);
                NewPage.this.finish();
            }
        });
 
    }
 
}

如果需要在 Activity 之间传输数据,还可以使用 Bunble 在 intent 中保存和获取数据。

2. 获取列表中被点击事项的位置
扩展 BaseAdapter 类,重写 getView 方法,第一个方法即为事项的位置,若要配合 cursor 使用,则可以使用 cursor.moveToPosition(position) 把 cursor 移动到事项在数据库中相应的数据行。

这里我们给大家总结了下关于Android TextView文本文字的常用两种应用,一种是像我们使用微信会看到长文件是可以折叠显示了,还有一种就是TextView文字颜色TextColor焦点效果,下面我一起来看这两种方法。

textview文字状态一,TextView文字颜色TextColor焦点效果

 代码如下 复制代码

<TextView

android:id="@+id/tv_quit"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="@drawable/list_item_color" />

 

list_item_color 文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 单击选中时字体颜色-->

<item android:state_pressed="true" android:color="#FFFFFF" />

<!-- 有焦点时的字体颜色-->

<item android:state_focused="true" android:color="#FFFFFF" />

<!-- 滚动选中时字体颜色-->
<item android:state_selected="true" android:color="#FFFFFF" />

<!-- 默认字体颜色-->

<item android:color="#000000" />

</selector>


textview文字状态二,Android TextView文本折叠效果

本例要实现文本展开收起的效果,即默认只显示4行文字,如果textview文字超过4行的话,点击右下角的 更多 按钮即可查看全部的内容。之前的做法是根据 TextView 中的字数来判断,效果不太好。这里在一个FrameLayout 包裹两个 TextView

布局文件 activity_main.xml

 

 代码如下 复制代码

<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:padding="10dp"
tools:context=".MainActivity" >

<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/textview_fold" />

<FrameLayout 
        android:id="@+id/fl_desc" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_below="@id/tv_title" 
        android:fadingEdge="horizontal" 
        android:fadingEdgeLength="5dp" > 

        <TextView 
            android:id="@+id/tv_desc_short" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:maxLines="4" 
            android:textColor="@color/black" 
            android:textSize="16sp" /> 

        <TextView 
            android:id="@+id/tv_desc_long" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:textColor="@color/black" 
            android:textSize="16sp" /> 
    </FrameLayout> 

<Button
android:id="@+id/bt_more"
android:layout_width="50dp"
android:layout_height="25dp"
android:layout_alignParentRight="true"
android:layout_below="@id/fl_desc"
android:layout_marginRight="10dp"
android:background="#1c000000"
android:gravity="center"
android:text="@string/label_more"
android:textSize="15sp"
android:visibility="gone" />

<ImageView
android:id="@+id/iv_more_line"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/bt_more"
android:layout_below="@id/fl_desc"
android:layout_toLeftOf="@id/bt_more"
android:background="@drawable/more_line"
android:contentDescription="@string/app_name"
android:visibility="gone" />

</RelativeLayout>

MainActivity.java

 

 代码如下 复制代码

package com.example.textviewfold;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

private Button bt_more;
private FrameLayout fl_desc;
private TextView tv_desc_short;
private TextView tv_desc_long;
private boolean isInit = false;
private boolean isShowShortText = true;
private ImageView iv_more_line;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findView();
initView();
setListener();
}

private void setListener() {
bt_more.setOnClickListener(this);
}

private void initView() {
String content = " 新浪科技讯 北京时间7月25日凌晨消息,在今天举行的新产品发布会上,谷歌发布Android 4.3版本,代号仍为"果冻豆 (Jelly Bean)"。今天发布的新一代Nexus 7将搭载该操作系统,Nexus系列设备今日可收到OTA推送更新。 Android 4.3操作系统新增一系列功能。首先是多用户设置功能,包括针对保护儿童的“受限文件(restricted profiles)” 特性。用户可以对应用内容进行限制,防止儿童在使用应用时看到不适宜内容,或接触不合适的应用内购买广告。这项功能与微软Windows Phone 的"儿童乐园(Microsoft's Kid's Corner)"功能类似。第二项升级是智能蓝牙(Bluetooth Smart)功 能,即"低功耗蓝牙(Bluetooth Low Energy)"。";
tv_desc_short.setText(content);
tv_desc_long.setText(content);

ViewTreeObserver vto = fl_desc.getViewTreeObserver();
vto.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (isInit)
return true;
if (mesureDescription(tv_desc_short, tv_desc_long)) {
iv_more_line.setVisibility(View.VISIBLE);
bt_more.setVisibility(View.VISIBLE);
}
isInit = true;
return true;
}
});
}

/**
* 计算描述信息是否过长
*/
private boolean mesureDescription(TextView shortView, TextView longView) {
final int shortHeight = shortView.getHeight();
final int longHeight = longView.getHeight();
if (longHeight > shortHeight) {
shortView.setVisibility(View.VISIBLE);
longView.setVisibility(View.GONE);
return true;
}
shortView.setVisibility(View.GONE);
longView.setVisibility(View.VISIBLE);
return false;
}

private void findView() {
fl_desc = (FrameLayout) findViewById(R.id.fl_desc);
tv_desc_short = (TextView) findViewById(R.id.tv_desc_short);
tv_desc_long = (TextView) findViewById(R.id.tv_desc_long);

bt_more = (Button) findViewById(R.id.bt_more);
iv_more_line = (ImageView) findViewById(R.id.iv_more_line);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_more:
  if (isShowShortText) { 

                tv_desc_short.setVisibility(View.GONE); 
                tv_desc_long.setVisibility(View.VISIBLE); 
            } else { 
                tv_desc_short.setVisibility(View.VISIBLE); 
                tv_desc_long.setVisibility(View.GONE); 
            } 
toogleMoreButton(bt_more);
isShowShortText = !isShowShortText;
break;

default:
break;
}
}

/**
* 更改按钮【更多】的文本
*/
private void toogleMoreButton(Button btn) {

String text = (String) btn.getText();
String moreText = getString(R.string.label_more);
String lessText = getString(R.string.label_less);
if (moreText.equals(text)) {
btn.setText(lessText);
} else {
btn.setText(moreText);
}
}
}

 

运行效果

为展开的状态

展开后的状态

 

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • 基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍

    这篇文章主要介绍了基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍 的相关资料,需要的朋友可以参考下...2016-05-14
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • .net数据库操作框架SqlSugar的简单入门

    这篇文章主要介绍了.net数据库操作框架SqlSugar的简单入门,帮助大家更好的理解和学习使用.net技术,感兴趣的朋友可以了解下...2021-09-22
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • CI框架开发新浪微博登录接口源码完整版

    首先来看下流程:流程原理: 1.通过code获得access_token通过授权,并获取用户的信息(包括用户u_id)(这个u_id在后面的第三方登录表里面叫sina_id,那个表是需要自己建的) 2.查询第三方登录表,如果不存在用户sina_id,分2...2014-05-31
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20