android一种非常好的打印log的封装的方法(可直接获得主调用方的方法名)

本文介绍了一个简化Android应用程序中Log信息打印的方法。通过自定义LogHelper类,能够自动获取调用方法的名字并将其作为Log标签的一部分,同时允许设置主TAG以区分不同项目。这大大减少了开发者在打印Log时的手动输入工作。

平时使用android里的Log类打印信息的时候后面会跟着一个TAG和一个信息,通常呢大家都是想打印调用Log的方法名,所以每次都要写一些不同的字符串,那么接下来这种方法可以有效的避免这些操作。

public class LogHelper {
    private static String sRootTag = "dengck";

    public static void setRootTag(String rootTag) {
        sRootTag = rootTag;
    }

    /**
     * 打印log详细信息
     */
    public static void d(String tag, String content) {
        Log.d(sRootTag + "_" + tag, content);
    }

    /**
     * 得到调用此方法的线程的线程名
     * 
     * @return
     */
    public static String getThreadName() {
        StringBuffer sb = new StringBuffer();
        sb.append(Thread.currentThread().getName());
        sb.append("-> ");
        sb.append(Thread.currentThread().getStackTrace()[3].getMethodName());
        sb.append("()");
        sb.append(" ");
        return sb.toString();
    }

 假设现在有这么一个类:

public class TestLog {

    private static final String TAG = "TestLog";

    public void test1() {
        LogHelper.d(TAG, LogHelper.getThreadName());
    }

    public void test2() {
        LogHelper.d(TAG, LogHelper.getThreadName()+" say something");
    }
}

 如果现在我们分别调用了test1()和test2(),则在log中将会分别打印

dengck_TestLog(线程序号):main->test1()

dengck_TestLog(线程序号):main->test2() say something

 

而且主TAG还可以设置,这样用在不同的项目中就可以设置不同的根TAG,查看log的时候查看这个根TAG就可以了.或者也可以查看某一个子TAG.最重要的是使用同一句代码就可以打印对应的方法了,而不用单独在给第二个参数赋值啦!

 

Activity进阶篇 课程回顾 Activity的创建过程 Activity的生命周期 Activity的启动模式 Intent的两种使用方法 本讲内容 1、Activity数据传递式 Intent不仅可以用来开启Activity,也可以在Activity之间传递数据。在数据传递时,可以使用putExtra() 法将数据存储在Intent中。 方法一: 1 2 3 4 String data = "Hello Activity02"; Intent intent = new Intent(this,Activity02.class); intent.putExtra("extra_data",data); startActivity(intent); 将数据从Activity02中取出的方法: 1 2 Intent intent = getIntent(); String data = = intent.getStringExtra("extra_data"); 方法二: putExtra()不仅可以传递基本类型数据,还可以传递Bundle对象。 1 2 3 4 5 Bundle bundle = new Bundle(); bundle.putString("name", "Linda"); Intent intent = new Intent(this,Activity02.class); intent.putExtras(bundle); startActivity(intent); 将Bundle对象数据从Activity02中取出的方法: 1 2 3 Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String stuName = bundle.getString("name"); 案例分析——用户注册 按照“视图-控制-模型”三个层次进行设计,过程如下: 1 2 3 4 5 创建主Activity(MainActivity)及其布局文件activity_main.xml,以及从 Activity(LoginSuccessActivity)及其布局文件activity_login_success.xml 在MainActivity的“登录”控件的点击事件处理机制中,将用户名和密码保存到新创建的Intent中,然 后将该Intent发送给LoginSuccessActivity public class MainActivity extends AppCompatActivity { EditText nameEditText; EditText passwordEditText; Button loginButton; 在LoginSuccessActivity接收传送过来的Intent,并将其数据显示在布局文件activity_login_success.xml 中。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*为“登录”按钮设置事件监听机制*/ loginButton = findViewById(R.id.login_button); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /*获取EditText控件中的用户名和密码*/ nameEditText = findViewById(R.id.user_edit_text); passwordEditText = findViewById(R.id.password_edit_text); String name = nameEditText.getText().toString().trim(); String password = passwordEditText.getText().toString().trim(); /*若用户名为“liu”,且密码为“123456”,则提示用户“登录成功”*/ if ((name.equals("liu") && password.equals("123456"))) { passData(name, password); } else { Toast.makeText(MainActivity.this, "用户名或者密码错误!", Toast.LENGTH_SHORT).show(); } } }); } private void passData(String name, String password) { Intent intent = new Intent(MainActivity.this, LoginSuccessActivity.class); /*将MainActivity中的用户名和密码保存到intent当中*/ intent.putExtra("name", name); intent.putExtra("password", password); startActivity(intent); } } 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 public class LoginSuccessActivity extends AppCompatActivity { TextView mUserTextView; TextView mPasswordTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_success); /*获取传送过来的Intent,并取出其中的数据*/ Intent intent = getIntent(); String name = intent.getStringExtra("name"); String password =intent.getStringExtra("password"); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2、Activity数据回传方法 在使用新浪微博APP时,能发现在微博发布页面进入图库选择图片后,会回到微博发布页面并带回了图 片选择页面的图片信息。这个功能的实现利用了Activity回传数据。实现过程分为以下三步: Activity01利用startActivityForResult()方法,将数据传送给Activity02。该方法接收两个参数,第一个 参数Intent用于保存所传递的数据,第二个参数requestCode用于判断数据的来源。例如: Activity02利用setResult()方法,将数据回传给Activity01。该方法接收两个参数。第一个参数结果码 resultCode用于判定数据处理结果是否成功,一般使用0或1;第二个参数Intent用于携带要回传的数 据。示例如下: Activity01重写onActivityResult()方法,获取Activity02所返回的数据。该方法接收三个参数。第一个 参数请求码requestCode判断数据来源;第二个参数结果码resultCode用于判定数据处理结果是否成 功,一般使用0或1;第三个参数Intent用于携带要回传的数据。示例如下: /*获取当前布局文件中的文本控件,并赋值*/ mUserTextView =findViewById(R.id.tv_username); mPasswordTextView = findViewById(R.id.tv_password); mUserTextView.setText("用户名:"+name); mPasswordTextView.setText("密码:"+password); } } 16 17 18 19 20 21 22 Intent intent=new Intent(Activity01.this,Activity02.class); startActivityForResult(intent, 1); 1 2 Intent intent=new Intent(); intent.putExtra(“equipment”, itemInfo); //封装数据,itemInfo为对象数据 setResult(1, intent); //回传数据,resultCode设为1,表示数据处理成功 finish(); //销毁当前Activity 1 2 3 4 案例分析——游戏装备购买 通过案例装备选择来演示Activity回传数据。本案例实现了购买装备增加生命值的功能。 构建MainActivity及其布局activity_main.xml,ShopActivity及其布局activity_shop.xml,详情参见附件 素材。 新知识:ProgressBar控件的使用。对于本案例,需要在activity_main.xml中增加以下ProgressBar控 件代码。 新知识:TableLayout控件和TableRow控件的使用。对于本案例,activity_shop.xml的代码如下。 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null&&requestCode==1 &&resultCode==1){ /*从回传过来的Intent中获取数据*/ ItemInfo info=(ItemInfo) data.getSerializableExtra("equipment"); ······ //其他处理 } } 1 2 3 4 5 6 7 8 9 <ProgressBar android:id="@+id/pb_attack" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/tv_attack" android:layout_marginTop="10dp" android:max="1000" /> 1 2 3 4 5 6 7 8 在MainActivity中,为“购买装备”按钮设置单击事件监听机制,当用户单击该按钮时,创建一个 Intent,并将请求码requestCode设为1,然后将该Intent传递给ShopActivity。 <?xml version="1.0" encoding="utf-8"?> <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:layout_margin="10dp" tools:context=".ShopActivity"> <!--在本界面中创建一个只有一行的表格--> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_goods_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="1" android:text="屠龙刀" android:textSize="20sp" /> <TextView android:id="@+id/tv_goods_function" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="攻击力100+" android:textSize="20sp" /> <Button android:id="@+id/bt_buy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="20dp" android:layout_toRightOf="@id/tv_goods_function" android:text="购买" /> </TableRow> </TableLayout> </RelativeLayout> 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 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAttackProgressBar= findViewById(R.id.pb_attack); mAttackProgressBar.setProgress(100); /*为“购买装备”按钮设置单击事件监听机制*/ mBuyButton = findViewById(R.id.bt_buy_weapon); mBuyButton.setOnClickListener(new View.OnClickListener() { 1 2 3 4 5 6 7 8 9 10 在ShopActivity中,为“购买”按钮设置单击事件监听机制,当用户单击该按钮时,创建一个Intent, 将攻击力的数值添加到该Intent中,并将结果码resultCode设为1,然后将该Intent回传给 MainActivity。 说明: 请求码requestCode和结果码resultCode均可以设置为任意整数,只要发生数据传递的两个Activity之 间约定好即可。 在MainActivity中,重写方法onActivityResult(),获取ShopActivity所返回的数据,更新进度条。 @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,ShopActivity.class); startActivityForResult(intent,1); } }); } 11 12 13 14 15 16 17 18 public class ShopActivity extends AppCompatActivity { Button mGoodsButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); mGoodsButton = findViewById(R.id.bt_buy); mGoodsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.putExtra("aggressivity", "100"); setResult(1,intent); finish(); } }); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null&&requestCode==1 &&resultCode==1){ /*获取回传Intent中所包含的攻击力数据,据此更新进度条*/ String attackString = data.getStringExtra("aggressivity").toString().trim(); int attackNum = Integer.parseInt(attackString); updateProgress(attackNum); //更新进度条 } } private void updateProgress(int attackNum) { int currentValue = mAttackProgressBar.getProgress(); if(currentValue<1000){ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 按照“视图-控制-模型”三个层次进行设计,新知识点归纳如下: 视图层中添加进度条; 利用属性layout_width和layout_weight,实现TableLayout控件中各个控件在水平向上的显示比 例。 3、课外作业 1)针对上述案例“游戏装备购买”,在实现数据回传过程中,放弃使用startActivityForResult(),而是采用 registerForActivityResult()(具有更好的易用性和接口统一性)来实现对回传数据的监听和处理。 主调Activity中的代码如下: currentValue = currentValue + attackNum; mAttackProgressBar.setProgress(currentValue); }else{ Toast.makeText(MainActivity.this,"您的攻击力已经最 大!",Toast.LENGTH_SHORT).show(); } } 15 16 17 18 19 20 public class MainActivity extends AppCompatActivity { ProgressBar mAttackProgressBar; Button mBuyButton; /* *调用registerForActivityResult()方法来注册一个对Activity结果的监听。 * registerForActivityResult()方法接收两个参数,第一个参数是一种Contract类型, * 由于我们是希望从另外一个Activity中请求数据,因此这里使用了StartActivityForResult这种 Contract。 * 第二个参数是一个Lambda表达式,当有结果返回时则会回调到这里,然后我们在这里获取并处理数据 即可。 * */ private ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode()==RESULT_OK) { /*获取回传Intent中所包含的攻击力数据,据此更新进度条*/ String attackString = result.getData().getStringExtra("aggressivity").toString().trim(); int attackNum = Integer.parseInt(attackString); updateProgress(attackNum); //更新进度条 } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAttackProgressBar = findViewById(R.id.pb_attack); mAttackProgressBar.setProgress(100); /*为“购买装备”按钮设置单击事件监听机制*/ mBuyButton = findViewById(R.id.bt_buy_weapon); mBuyButton.setOnClickListener(new View.OnClickListener() { @Override 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 46 47 48 49 50 51 public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ShopActivity.class); intentActivityResultLauncher.launch(intent); } }); } /*更新进度条*/ private void updateProgress(int attackNum) { int currentValue = mAttackProgressBar.getProgress(); if (currentValue < 1000) { currentValue = currentValue + attackNum; mAttackProgressBar.setProgress(currentValue); } else { Toast.makeText(MainActivity.this, "您的攻击力已经最大!", Toast.LENGTH_SHORT).show(); } } } 2)程序调试 以“游戏装备购买”案例为样本,–利用以下工具和技巧进行调试,解决项目中存在的问题,使之正常运行 并得到正确结果: 利用Build菜单中的Clean Project命令,重新编译项目。 利用测试框架Junit创建测试类。 利用android.util.log类的静态方法输入日志信息,并在程序运行时通过LogCat控制台查看Log信息。 通过Toast组件显示各种变量值,以观察错误。 设置断点,启动调试器跟踪程序运行过
最新发布
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值