「第一行代码」十三、你还应该掌握的高级技巧

全局获取Context的技巧

活动本身就是一个Context对象

class HttpUtil {
    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
        ...
        if (!isNetworkAvailable()) {
            //当检测到网络不存在的时候就给用户一个Toast提示
        }
    }
}

但在HttpUtil类中显然是获取不到Context对象的。想要快速解决问题,可以在sendHttpRequest()方法中添加一个Context参数。

class HttpUtil {
    public static void sendHttpRequest(final Context context, final String address, final HttpCallbackListener listener) {
        ...
        if (!isNetworkAvailable()) {
            //当检测到网络不存在的时候就给用户一个Toast提示
            Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
        }
    }
}

但这种解决方案实际上是推卸责任,将获取Context对象的任务转移给了sendHttpRequest()方法的调用方,至于调用方如何获得Context对象、能否获得Context对象,就撒手不管了。

 

Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。我们可以定制一个自己的Application类,以便于管理程序内一些全局的状态信息,比如说全局Context。

public class Myapplication extends Application {

    private static Context context;

    @Override
    public void onCreate() {
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }
    
}

重写了父类的onCreate()方法,并通过调用getApplicationContext()方法得到了一个应用程序级别的Context,然后又提供了一个静态的getContext()方法,在这里将刚才获得的Context进行返回。

接下来需要告知系统,当程序启动的时候应该初始化MyApplication类,而不是默认的Application类。在AndroidManifest文件的<application>标签中进行指定即可。

<application
    android:name="com.example.networktext.MyApplication"
    ...>
    ...
</ application>

注意,任何一个项目都只能配置一个Application

至此实现了一种全局获取Context的机制,之后不管想在项目任何地方使用Context,只需要调用MyApplication.getContext()方法即可。

 

class HttpUtil {
    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
        ...
        if (!isNetworkAvailable()) {
            //当检测到网络不存在的时候就给用户一个Toast提示
            
            //不再需要通过传参的方式来得到Context对象
            //调用MyApplication.getContext()即可
            Toast.makeText(MyApplication.getContext(), "network is unavailable", Toast.LENGTH_SHORT).show();
        }
    }
}

此时不再需要通过传参的方式来得到Context对象,调用MyApplication.getContext()即可。

 

使用Intent传递对象

Intent可以借助它启动活动、发送广播、启动服务等。在进行上述操作时,还可以在Intent中添加一些附加数据,以达到传值的效果。

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("string_data", "hello");
intent.putExtra("int_data", 100);
startActivity(intent);

调用了Intent的putExtra()方法来添加要传递的数据,之后在SecondActivity中就可以得到这些值。

getIntent().getStringExtra("string_data");
getIntent().getIntExtra("int_data", 0);

 

使用Intent传递对象通常有两种实现方式:Serializable和Parcelable。

Serializable序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

实现序列化的方法很简单,只需要让一个类实现Serializable接口即可。

public class Person implements Serializable {
    private String name;

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

这里让Person类实现了Serializable接口。

Person person = new Person();
person.setName("Tom");
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);

由于Person类实现了Serializable接口,所以才可以这样写。

接下来在SecondActivity中获取这个对象也很简单。

Person person = (Person) getIntent().getSerializableExtra("person_data");

 

Lambda表达式

Lambda表达式本质上是一种匿名方法,既没有方法名,也即没有访问修饰符和返回值类型,使用它来编写代码将会更加简洁、易读。

如果想在Android项目中使用Lambda表达式或者Java8的特性,需要在app/build.gradle中添加如下配置:

    defaultConfig {
        ...

        jackOptions.enabled = true;
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8;
        targetCompatibility JavaVersion.VERSION_1_8;
    }

传统情况下开启一个子线程的写法:

new Thread(new Runnable() {
    @Override
    public void run() {
        //具体逻辑
    }
}).start();

使用Lambda表达式的写法:

new Thread(() -> {
    //具体逻辑
}).start();

为什么可以这么写呢?

因为Thread类的构造函数接受的参数是一个Runnable接口,而Runnable接口中只有一个待实现的方法

public interface Runnable {
    void run();
}

凡是这种只有一个待实现方法的接口,都可以使用Lambda表达式的写法。

 

通常创建一个类似于上述接口的匿名类实现需要这样写法:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //具体实现
    }
};

有了Lambda表达式后可以这样写:

Runnable runnable = () -> {
    //具体实现
};

 

新建一个MyListener接口:

public interface MyListener {
    String doSth(String a, int b);
}

使用Lambda表达式创建MyListener接口的匿名实现写法:

MyListener listener = (String a, int b) -> {
    String result = a + b;
    return result;
}

java还会根据上下文自动推断出Lambda表达式中的参数类型,可以简化为:

MyListener listener = (a, b) -> {
    String result = a + b;
    return result;
}

 

一个具体的例子:

public void hello(MyListener listener) {
    String a = "hello lambda";
    int b = 1024;
    String result = listener.doSth(a, b);
    Log.d("TAG", result);
}

在调用hello()方法时可以这样写:

hello((a, b) -> {
    String result = a + b;
    return result;
});

 

处理点击事件时也可以使用Lambda表达式:

//不实用Lambda表达式
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //处理点击事件
    }
});

//使用Lambda表达式
button.setOnClickListener((v) -> {
    //处理点击事件
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在编写 C 语言代码时,您可以采用以下技巧使代码看起来更专业和高级: 1. 养成良好的命名习惯。在命名变量、常量、函数和结构体时,使用明确而描述性强的名称,能够让代码更加可读性强。 2. 注释。在代码中添加有意义的注释,能够帮助读者理解代码的意图和实现。 3. 缩进。使用缩进来组织代码,使得代码的结构更加清晰,更易于阅读。 4. 遵循编码规范。遵循一定的编码规范能够使代码风格统一,更加专业。 5. 使用结构体和函数。使用结构体和函数能够使代码更加模块化,更易于维护和扩展。 6. 使用常量。使用常量能够使代码更加可维护,因为当常量的值需要更改时,只需要在一个地方修改即可。 7. 使用预处理器指令。使用预处理器指令能够让代码更加简洁,更易于维护。 8. 使用第三方库。使用第三方库能够让您的代码调用更加丰富的功能,提高开发效率。 ### 回答2: 要让C代码看起来专业和高级,以下是一些技巧可以帮助实现: 1. 保持代码整洁和易读:使用有描述性的变量名、函数名和注释来使代码更易于理解和维护。 2. 遵循编码约定:遵循一致的缩进、命名规则和代码风格。保持代码的一致性有助于他人更容易理解你的代码,并且提高代码的可读性。 3. 使用合适的数据结构和算法:选择合适的数据结构和算法可以提高代码的效率和性能。了解不同数据结构和算法的优劣势,并选择最适合问题的解决方案。 4. 错误处理和异常处理:编写稳健的代码来应对各种错误和异常情况。在代码中处理错误并提供有意义的错误消息能够提高代码的可靠性和健壮性。 5. 模块化设计:将代码分解成小的模块,每个模块负责一个明确的功能。这样可以提高代码的复用性和可维护性,并降低出错的可能性。 6. 使用适当的设计模式:了解和应用适当的设计模式可以使代码更加灵活和可扩展。设计模式提供了一些经过验证的解决方案来解决常见的设计问题。 7. 进代码审查和测试:请同事或团队成员审查你的代码,并提供反馈。进全面的测试,确保代码的正确性和稳定性。 8. 持续学习和更新:密切关注C语言的最新发展和技术,学习新的技术和最佳实践。不断提升自己,保持对代码质量的高要求。 遵循这些技巧可以让C代码更加专业和高级,提高代码的可读性、可扩展性和可维护性。 ### 回答3: 要让C代码看起来专业和高级,可以考虑以下几个技巧: 1. 使用有意义的变量和函数命名:避免使用简单的字母或数字作为变量名,应该选择能够反映变量或函数用途的有意义的名称,让代码更易读和理解。 2. 编写清晰的注释:对于复杂的算法或功能,添加适当的注释可以提高代码可读性,并帮助其他人理解你的代码逻辑。 3. 使用设计模式:掌握一些常见的设计模式,如单例模式、观察者模式等,将其应用在代码中,可以提高代码的可扩展性和可维护性。 4. 使用面向对象的编程技巧:将代码组织成多个类和对象,封装数据和功能,并使用继承、多态等面向对象的特性,使代码更加模块化和可扩展。 5. 异常处理:在代码中合理处理异常情况,避免程序崩溃或不可预测的为,同时给出清晰的错误提示,提高代码的健壮性和可靠性。 6. 提高代码的效率:对于需要频繁执代码段,可以考虑使用更高效的算法或数据结构,减少时间和空间复杂度,提高代码的执速度和性能。 7. 代码重用:将一些通用的功能封装成函数或模块,以便在其他项目中复用,避免重复编写相同的代码,提高开发效率。 8. 代码风格统一:遵循一致的代码风格,如缩进、命名规范等,使代码看起来整洁、统一,并使用代码格式化工具进自动格式化。 通过掌握以上技巧,并不断进代码审查和优化,可以让C代码更加专业和高级

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值