Android学习笔记

我的Android之路
posts - 13, comments - 3, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2010年6月13日

我们在Eclipse中经常使用Logcat窗口查看日志信息,不过其实也可以在手机上显示日志。下面的例子就是在textview中显示logcat日志。
java代码如下:
 1 
 2 package LogcatTextView.com;
 3 
 4 import java.io.BufferedReader;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 
 8 import android.app.Activity;
 9 import android.os.Bundle;
10 import android.widget.ScrollView;
11 import android.widget.TextView;
12 
13 public class LogcatTextView extends Activity {
14     /** Called when the activity is first created. */
15     @Override
16     public void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.main);
19 
20         try {
21 
22             Process process = Runtime.getRuntime().exec("logcat -d");
23 
24             BufferedReader bufferedReader = new BufferedReader(
25 
26             new InputStreamReader(process.getInputStream()));
27 
28             StringBuilder log = new StringBuilder();
29 
30             String line;
31 
32             while ((line = bufferedReader.readLine()) != null) {
33 
34                 log.append(line);
35 
36             }
37 
38             TextView tv = (TextView) findViewById(R.id.tvLogcat);
39 
40             tv.setText(log.toString());
41 
42             final ScrollView scrollView = (ScrollView) findViewById(R.id.scrlLogcat);
43 
44             scrollView.post(new Runnable() {
45                 @Override
46                 public void run() {
47                     scrollView.fullScroll(ScrollView.FOCUS_DOWN);
48                 }
49             });
50 
51         } catch (IOException e) {
52 
53         }
54     }
55 }
不要忘记加上权限
<uses-permission android:name="android.permission.READ_LOGS" />

posted @ 2011-03-09 13:44 andteamroid 阅读(5648) | 评论 (3)编辑 收藏

    当你在后台使用Thread或者AsyncTask来处理一些耗时的操作时,可能想要对这些线程加以控制,其中包括中断线程。

    很多情况下,当用户启动程序的时候,一个后台运行的线程会同时启动去加载内容。但是,当用户离开程序时,线程应该被打断,因为现在用户已经不再关注程序了,同时也不再关注线程处理的结果,而线程是要占用系统的资源的,如果不及时中断线程,会导致系统资源的浪费。

    可是怎么去中断一个线程呢?从文档中可以看到Thread类有stop()方法,这个方法提供一个“简单”的方法去中断线程。不过这种野蛮的中断方式会导致一些问题,而且现在这个方法已经不推荐使用了。

    除此之外,你可以使用Thread.interrupt()或者AsyncTask.cancel()方法,但是这不会马上中断线程,因此,只能在自己的线程中实现中断并退出。

    在许多情况下,后台运行的线程都有一个主循环,因此你可以在循环中判断线程是否被中断,若被中断,则退出循环,从而结束进程。例如一个线程下载线程,可以通过isInterrupted()方法判断当前线程是否被中断。

thread = new Thread() {
  
public void run() {
    
    
while(!isInterrupted() && hasMoreDataToDownload()){
      downloadAndWriteSomeMore();
    }
    
if(isInterrupted()){
      deleteThePartiallyDownloadedFile();
    }
else{
      callBack();
    }
  }
}
thread.start();
thread.interrupt();

 

    如果线程被中断,则调用deleteThePartiallyDownloadedFile()函数,删除没有完成下载的文件。当线程没有被中断,则调用callBack()函数,可以使用handler发送下载完成的信息。

    如果你的线程中没有这样一个主循环,例如只是执行一个很耗时的SQL查询操作,可以在查询操作之后调用 isInterrupted()来判断是否需要结束线程。

    文章翻译自:http://www.helloandroid.com/tutorials/interruptingcancelling-threads

posted @ 2011-03-09 12:53 andteamroid 阅读(5358) | 评论 (0)编辑 收藏

在Android中,目前,我知道有两种出现锯齿的情况。 ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。 ② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。我们分别以这两种情况加以考虑。 ◆ 用Canvas绘制位的的情况。在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要做到防止锯齿,我们就要使用到这个参数。如下:首先在你的构造函数中,需要创建一个Paint。 Paint mPaint = new Paint(); 然后,您需要设置两个参数: 1)mPaint.setAntiAlias(); 2)mPaint.setBitmapFilter(true)。第一个函数是用来防止边缘的锯齿,第二个函数是用来对位图进行滤波处理。最后,在画图的时候,调用drawBitmap函数,只需要将整个Paint传入即可。 ◆ 有时候,当你做RotateAnimation时,你会发现,讨厌的锯齿又出现了。这个时候,由于你不能控制位图的绘制,只能用其他方法来实现防止锯齿。另外,如果你画的位图很多。不想每个位图的绘制都传入一个Paint。还有的时候,你不可能控制每个窗口的绘制的时候,您就需要用下面的方法来处理——对整个Canvas进行处理。 1)在您的构造函数中,创建一个Paint滤波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。 2)当你在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。 canvas.setDrawFilter( mSetfil ); ★ 最后,另外,在Drawable类及其子类中,也有函数setFilterBitmap可以用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果。

posted @ 2010-10-22 17:01 andteamroid 阅读(3246) | 评论 (0)编辑 收藏

好不容易折腾好了sdk,自然要把adb用起来,但是我打开终端输入adb devices,得到的却是如下内容:

???????????? no permissions

乍一看好像需要root权限,可是输入sudo adb devices,还是不行,上网研究了一下,原来最开始启动adb的时候要有root权限,然后就随便了,如果一开始忘记了加sudo,就必须先终止adb,然后重来,过程如下:

$ adb kill-server
$ sudo adb start-server
$ adb devieces

看看是不是可以得到设备信息了?我的机器是G1,不过所有android系统的机器应该都一样的。

另外,如果你向我一样把sdk的目录写进了当前用户的PATH设置,但是root用户的PATH里没有,那么第二步会提示command not found,只要换成如下命令就行了:

$ sudo /sdk安装目录/tools/adb start-server


转自:http://alfred.bt4.org/archives/384

posted @ 2010-06-13 00:30 andteamroid 阅读(566) | 评论 (0)编辑 收藏