1anc3r

Lonely roads god only knows.

M.J

AsyncTask源码解析

——关于关于Android并发编程你需要知道的事

学习了几个月Android的同学都知道,Android4.0以后不允许在UI线程中执行耗时操作,如网络I/O,另外还有一些操作虽然可以在UI线程中执行,但是很容易导致内存泄漏、应用崩溃,如瀑布流照片墙。那么问题来了,Android并发编程的正确姿势是什么?

Android Developers官方文档上是这样描述AsyncTask的:AsyncTask enables proper and easy use of the UI thread.翻译成大家能听懂的话说就是,AsyncTask能够更方便地(在子线程中)更新UI线程。AsyncTask以其[……]

Read more

2016年10月11日 0 / /
标签:  暂无标签

1anc3r-s-Android-App-List

 

Calculator(计算器)

Calculator

简介

第一个Android应用。不过当时版本的开发环境是ADT / SDK 19(Android 4.4),界面布局和按钮的事件处理。当前版本的开发环境是Android Studio /  SDK 21(Android 5.0),加入表达式计算功能(栈)。Click here to download

截图 

 

 

 

 

 

 

 

 

 

 

Contacts(通讯录)

Contacts

简介

一个功能完善的通讯录应用,可以搜索查看联系人、也可以打电话发短信。界面:ListView分组,挤压动画,字母索引。功能:ContentResolver获取联系人信息,调用系统API打电话发短信,[……]

Read more

2016年7月26日 0 / /
标签:  暂无标签

AirFree —— Android to PC Remote

 

  • 初衷

           数月前,我们实验室着手开发一个能够在Android和Windows之间远程资源共享和设备控制的项目——AirFree。AirFree的构想是由实验室的指导老师和学长提出的,并由几个小伙伴一起不断整合的。最初我的任务是Android端的开发,另外几个同学负责iOS端、Windows Phone端以及PC端的开发,在项目迭代的过程中,iOS端重构、Windows Phone废弃,甚至由我用Java重构了PC端,再后来测试审核上线,可以说AirFre[……]

Read more

2016年7月24日 3 / /
标签:  暂无标签

[Android]计算器

    基本上学习了android的按钮控件就可以做一个计算器,上学期数据结构学了使用栈实现多项式计算,我也改进了一下我的计算器。

MainActivity.java

package me.lancer.calculator;
 
import java.math.BigDecimal;
import java.text.DecimalFormat;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    String expression = "";
    String result = "0";
    private TextView expView;
    private TextView resView;
    String l = "";
    int flag = 0;
    float d;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 
        expView = (TextView) findViewById(R.id.exp);
        resView = (TextView) findViewById(R.id.res);
 
        Button zero = (Button) findViewById(R.id.zero);
        zero.setOnClickListener(new MyClickListener());
 
        Button one = (Button) findViewById(R.id.one);
        one.setOnClickListener(new MyClickListener());
 
        Button two = (Button) findViewById(R.id.two);
        two.setOnClickListener(new MyClickListener());
 
        Button three = (Button) findViewById(R.id.three);
        three.setOnClickListener(new MyClickListener());
 
        Button four = (Button) findViewById(R.id.four);
        four.setOnClickListener(new MyClickListener());
 
        Button five = (Button) findViewById(R.id.five);
        five.setOnClickListener(new MyClickListener());
 
        Button six = (Button) findViewById(R.id.six);
        six.setOnClickListener(new MyClickListener());
 
        Button seven = (Button) findViewById(R.id.seven);
        seven.setOnClickListener(new MyClickListener());
 
        Button eight = (Button) findViewById(R.id.eight);
        eight.setOnClickListener(new MyClickListener());
 
        Button nine = (Button) findViewById(R.id.nine);
        nine.setOnClickListener(new MyClickListener());
 
        Button clean = (Button) findViewById(R.id.clean);
        clean.setOnClickListener(new MyClickListener());
 
        Button left = (Button) findViewById(R.id.left);
        left.setOnClickListener(new MyClickListener());
 
        Button right = (Button) findViewById(R.id.right);
        right.setOnClickListener(new MyClickListener());
 
        Button point = (Button) findViewById(R.id.point);
        point.setOnClickListener(new MyClickListener());
 
        Button addition = (Button) findViewById(R.id.addition);
        addition.setOnClickListener(new MyClickListener());
 
        Button subtraction = (Button) findViewById(R.id.subtraction);
        subtraction.setOnClickListener(new MyClickListener());
 
        Button multiplication = (Button) findViewById(R.id.multiplication);
        multiplication.setOnClickListener(new MyClickListener());
 
        Button division = (Button) findViewById(R.id.division);
        division.setOnClickListener(new MyClickListener());
 
        Button equal = (Button) findViewById(R.id.equal);
        equal.setOnClickListener(new MyClickListener());
 
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        ViewGroup.LayoutParams lp = zero.getLayoutParams();
        lp.width = width / 2 - 3;
        zero.setLayoutParams(lp);
        lp = point.getLayoutParams();
        lp.width = width / 4 - 3;
        point.setLayoutParams(lp);
        lp = equal.getLayoutParams();
        lp.width = width / 4 - 3;
        equal.setLayoutParams(lp);
    }
 
    class MyClickListener implements OnClickListener {
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.zero:
                case R.id.one:
                case R.id.two:
                case R.id.three:
                case R.id.four:
                case R.id.five:
                case R.id.six:
                case R.id.seven:
                case R.id.eight:
                case R.id.nine:
                    if (flag == 0) {
                        expView.setText("0");
                        resView.setText("0");
                        expression = "";
                        result = "0";
                        flag = 1;
                    } else {
                        flag = 1;
                    }
                    expression = expression
                            + String.valueOf(((Button) v).getText());
                    result = result + String.valueOf(((Button) v).getText());
                    expView.setText(expression);
                    break;
                case R.id.point:
                case R.id.addition:
                case R.id.subtraction:
                case R.id.left:
                case R.id.right:
                    flag = 2;
                    expression = expression
                            + String.valueOf(((Button) v).getText());
                    result = result + String.valueOf(((Button) v).getText());
                    expView.setText(expression);
                    break;
                case R.id.multiplication:
                    flag = 2;
                    expression = expression + "×";
                    result = result + "*";
                    expView.setText(expression);
                    break;
                case R.id.division:
                    flag = 2;
                    expression = expression + "÷";
                    result = result + "/";
                    expView.setText(expression);
                    break;
                case R.id.equal:
                    try {
                        d = (float) (new Calculator(result).getRes());
                        l = "" + d;
                        if (d > 10000000 && l.indexOf("E") != 0) {
                            String strarr[] = l.split("E");
                            DecimalFormat df = new DecimalFormat("#.00000");
                            l = "";
                            l = df.format(Double.parseDouble(strarr[0])) + "E"
                                    + strarr[1];
                        }
                        if (d == -1024 * 1024) {
                            resView.setText("Error");
                            expression = expression + "=";
                            expView.setText(expression);
                            expression = "";
                            result = "0";
                        } else {
                            resView.setText(new BigDecimal(l).stripTrailingZeros() + "");
                            expression = expression + "=";
                            expView.setText(expression);
                            expression = l;
                            result = l;
                        }
                    } catch (Exception e) {
                        resView.setText("Error");
                        expression = expression + "=";
                        expView.setText(expression);
                        expression = "";
                        result = "0";
                    }
                    flag = 0;
                    break;
                case R.id.clean:
                    expView.setText("0");
                    resView.setText("0");
                    expression = "";
                    result = "0";
                    break;
                default:
                    break;
            }
        }
    }
}

Calculator.java

package me.lancer.calculator;
 
import java.util.HashMap;
import java.util.Stack;
 
public class Calculator {
 
    private static HashMap<String, Integer> opLs;
    private String str;
 
    public Calculator(String str) {
 
        this.str = str;
 
        if (opLs == null) {
            opLs = new HashMap<String, Integer>(6);
            opLs.put("+", 0);
            opLs.put("-", 0);
            opLs.put("*", 1);
            opLs.put("/", 1);
            opLs.put("%", 1);
            opLs.put(")", 2);
        }
    }
 
    public String toRpn() {
 
        String[] strArray = split(str);
        Stack<String> rpn = new Stack<String>();
        Stack<String> tmp = new Stack<String>();
 
        for (String str : strArray) {
            if (isNum(str)) {
                rpn.push('(' + str + ')');
            } else {
                if (tmp.isEmpty()) {
                    tmp.push(str);
                } else {
                    if (isHigh(tmp.peek(), str)) {
                        if (!str.equals(")")) {
                            do {
                                rpn.push(tmp.pop());
                            } while (!tmp.isEmpty() && (isHigh(tmp.peek(), str)));
 
                            tmp.push(str);
                        } else {
                            while (!tmp.isEmpty() && !tmp.peek().equals("(")) {
                                rpn.push(tmp.pop());
                            }
                            if ((!tmp.empty()) && (tmp.peek().equals("("))) {
                                tmp.pop();
                            }
                        }
                    } else if (!isHigh(tmp.peek(), str)) {
                        tmp.push(str);
                    }
                }
            }
 
        }
        while (!tmp.empty()) {
            rpn.push(tmp.pop());
        }
        StringBuilder st = new StringBuilder();
        for (String str : rpn) {
            st.append(str);
        }
        rpn.clear();
        return st.toString();
    }
 
    private String[] split(String str) {
 
        StringBuilder sb = new StringBuilder(str.length());
 
        for (char ch : str.toCharArray()) {
            if (ch == '+' || ch == '-' || ch == '*' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '%') {
                sb.append(",");
                sb.append(ch);
                sb.append(",");
            } else {
                sb.append(ch);
            }
        }
        String string = sb.toString().replaceAll(",{2,}", ",");
        return string.split(",");
    }
 
    private boolean isHigh(String pop, String str) {
        if (str.equals(")")) {
            return true;
        }
        if (opLs.get(pop) == null || opLs.get(str) == null) {
            return false;
        }
        return opLs.get(pop) >= opLs.get(str);
 
    }
 
    public boolean isNum(String str) {
        for (char ch : str.toCharArray()) {
            if (ch == '+' || ch == '-' || ch == '*' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '%') {
                return false;
            }
        }
        return true;
    }
 
    public double getRes() {
 
        String rpn = toRpn();
        Stack<Double> res = new Stack<Double>();
        StringBuilder sb = new StringBuilder();
 
        for (char ch : rpn.toCharArray()) {
            if (ch == '(') {
                continue;
            } else if (ch >= '0' && ch <= '9' || ch == '.') {
                sb.append(ch);
            } else if (ch == ')') {
                res.push(Double.valueOf(sb.toString()));
                sb = new StringBuilder();
            } else {
                if (!res.empty()) {
                    Double x = res.pop();
                    Double y = res.pop();
                    switch (ch) {
                        case '+':
                            res.push(y + x);
                            break;
                        case '-':
                            res.push(y - x);
                            break;
                        case '*':
                            res.push(y * x);
                            break;
                        case '%':
                        case '/':
                            if (x != 0) {
                                double rsd = ch == '%' ? y % x : y / x;
                                res.push(rsd);
                            } else {
                                res.clear();
                                return -1024 * 1024;
                            }
                            break;
                    }
                }
            }
        }
        Double result = res.pop();
        res.clear();
        return result;
    }
}
2016年3月5日 0 / /
标签:  暂无标签

[Android]多功能时钟

    现今好多手机上自带多功能时钟,用户体验比较好的应该是iphone的clock了,app图标上的时针会随着时间改变而改变,而且app不仅有查看时间的功能,还可以作为闹钟,秒表和计时器使用。一开始我写了个秒表,后来又写了个计时器,然后又学了如何写闹钟,最后我就把这些功能合在一起了。

    一开始单独写的时候使用的activity,后来在几个功能之间快速切换的时候觉得activity不靠谱,于是我使用了ViewPager,一个activity通过ViewPager与四个Fragment联系在一起。

MainActivity.java

9c678b73e66ead51b8f3de619338b[……]

Read more

2016年3月4日 0 / /
标签:  暂无标签

[Android]通讯录

    一谈起电话,必不可少的功能就是打♂电话,饭可以乱吃电话不能乱打,一开始大家都使用黄页记录电话,这个黄页不是黄色(哔~)网页,而是类似字典一样的东西,后来出现了手机,顺便出现了手机通讯录,记录电话的方式也从厚厚的黄页摇身一变成了手机中的数据库。我想通过这个通讯录学习分组列表,字母导航以及搜索筛选。

    按照面对对象的思想,每一个联系人信息都是一个对象,所以我先创建联系人对象。

Contact.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package me.lancer.contacts;
 
public class Contact {
 
    private String sortKey;//姓氏首字母
 
    private String name;//名字
 
    private String number;//号码
 
    //下面是联系人三个属性的getter setter方法
    public String getSortKey() {
        return sortKey;
    }
 
    public void setSortKey(String sortKey) {
        this.sortKey = sortKey;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
}

    然后我们要使用ListView将联系人们呈现在页面上,所以需要Adapter适配器。

ContactAda[……]

Read more

2016年3月4日 0 / /
标签:  暂无标签

[Android]贪吃蛇(手势控制)

    谷歌在每一代android的sdk中添加了一些方便开发者熟悉新版本特性的smaple,所有的sample都可以在sdk manage中下载。今天我介绍的贪吃蛇应用程序就是android 2.2中的一个sample,但是2.2年代大部分android手机并不是触屏而是自带键盘,所以我想通过改写这个sample介绍一下在android中如何进行手势控制。

    首先我们还是熟悉一下这个sample的结构。Snake工程下包括三个.java文件,分别是继承自android.view.View的表示每一个方块的底层类——TileView.java,继承自TileView用于实现游戏逻辑、绘[……]

Read more

2016年3月4日 0 / /
标签:  暂无标签

[C & Python]混编

foo.c

1
2
3
4
5
6
7
8
9
10
11
#include 
#include 
 
int foo1(int a, int b){
    foo2(a, b);
    return a+b;
}
 
int foo2(int a, int b){
    printf("%d + %d = ", a, b);
}

 

在当前路径打开cmd

键入gcc -o foo.so -shared -fPIC foo.c

编译成功后当前路径会生成.so文件

 

test.py

1
2
3
4
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./foo.so")
print lib.foo1(1, 3)

 

再在当前路径打开cmd

键入python test.py

输出格式如下:

#>python test.py
1 + 3 = 4

 

2015年12月23日 0 / /
标签:  暂无标签

Toposort

    在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该的一个拓扑排序英语Topological sorting)。

  1. 每个顶点出现且只出现一次;
  2. 若A在序列中排在B的前面,则在图中不存在从B到A的路径

 

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void FindId(AdjMatrix &amp;G, int indegree[MAX_VERTEX_NUM]){
	int i, j;
	for (i = 0; i &lt; G.vexnum; ++i){
		indegree[i] = 0;
	}
	for (j = 0; j &lt; G.vexnum; ++j){
		for (i = 0; i &lt; G.vexnum; ++i){
			if (G.arcs[i][j] != INF &amp;&amp; G.arcs[i][j] != 0 ){
				indegree[j]++;
			}
		}
	}
}
 
int TopoSort(AdjMatrix &amp;G){
	Queue Q;
	int indegree[MAX_VERTEX_NUM];
	int i, j, count;
	FindId(G, indegree);
	Queue_Init(&amp;Q);
	for (i = 0; i &lt; G.vexnum; ++i){
		if (indegree[i] == 0){
			Queue_Push(&amp;Q,i);
		}
	}
	count = 0;
	while(!Queue_Empty(&amp;Q)){
		i = Queue_Pop(&amp;Q);
		printf("%c ", G.vexs[i]);
		count++;
		for (j = 0; j &lt; G.vexnum; ++j){
			if (G.arcs[i][j] != INF){
				indegree[j]--;
				if (indegree[j] == 0){
					Queue_Push(&amp;Q, j);
				}
			}
		}
	}
	if (count &lt; G.vexnum){
		return 0;
	}else{
		return 1;
	}
}

    输入:

0.Create UnDirected Graph
1.Create Directed Graph
0/1: 1 8 10
Num of Vexs & Arcs (e.g. 6 6): 8 10
8 Vexs (e.g. ABCDEF): ABCDEFGH
V[……]

Read more

2015年12月8日 0 / /
标签:  暂无标签

Dijkstra

    Dijkstra是求最短路径的经典算法,其基本指导思想:初始时,原点 s 的路径长度值被赋为 0 (d[s] = 0),若存在能直接到达的边(s,m),则把d[m]设为w(s,m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于 V 中所有顶点 vs 和上述 md[v] = ∞)。当算法结束时,d[v] 中存储的便是从sv 的最短路径,或者如果路径不存在的话是无穷大。

    下面再有请灵魂画师小枪为大家举栗讲解:

    1.在上一次Prim的图上标上箭头,get一张带权有向图,图中依然有6个顶点,10条边,已找[……]

Read more

2015年12月8日 0 / /
标签:  暂无标签
回到顶部