当前位置: 首页 > news >正文

第十四站:Java玫瑰金——移动开发(第二篇)

处理不同类型的网络连接和增强错误处理及用户反馈,需要我们对网络状态检查逻辑进行扩展,并在UI上给予用户适当的提示。以下是对Java代码的进一步扩充:

  1. 网络状态检查扩展:区分Wi-Fi和移动数据,并根据网络类型提供不同的用户反馈。

  2. 错误处理:在数据库操作、网络请求等关键环节添加异常捕获和处理。

  3. 用户反馈:通过UI提示用户当前的网络状态和操作结果。

以下是示例代码:

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import android.content.DialogInterface;
import android.app.AlertDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;public class MyActivity extends Activity {// ... 其他成员变量和方法private static final int PERMISSION_REQUEST_CODE = 1;private boolean checkNetworkType() {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();if (activeNetwork != null && activeNetwork.isConnected()) {if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {return true; // Wi-Fi连接} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {return true; // 移动数据连接}}return false; // 无网络连接}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);// 请求权限// ... 省略之前的代码// 设置按钮点击监听器submitButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (checkNetworkType()) {// 网络连接检查通过,执行操作// ... 省略之前的代码} else {// 网络不可用,提示用户showNetworkErrorDialog();}}});// ... 其他代码}private void showNetworkErrorDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage("您的设备当前没有连接到互联网。请检查您的网络设置。").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// 用户点击“确定”按钮后的操作}});AlertDialog dialog = builder.create();dialog.show();}// 在saveInputToDatabase方法中使用事务private void saveInputToDatabase(String input) {SQLiteDatabase db = databaseHelper.getWritableDatabase();db.beginTransaction();try {// 数据库操作// ... 省略之前的代码db.setTransactionSuccessful();} catch (Exception e) {// 显示数据库操作错误showErrorDialog("数据库操作失败,请重试。");} finally {db.endTransaction();db.close();}}private void showErrorDialog(String message) {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage(message).setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// 用户点击“确定”按钮后的操作}});AlertDialog dialog = builder.create();dialog.show();}// ... 其他代码
}

在上述代码中,我们添加了checkNetworkType方法来检查当前网络连接的类型,并在onClick方法中使用该方法来决定是否执行操作。如果网络不可用,我们调用showNetworkErrorDialog方法来提示用户。

同时,我们在saveInputToDatabase方法中添加了异常捕获和处理,如果数据库操作失败,会调用showErrorDialog方法来显示错误信息。

进一步细化错误处理和用户反馈机制,我们可以采取以下措施:

  1. 区分错误类型:识别和区分不同类型的错误,例如网络错误、数据库错误、解析错误等,并提供针对性的反馈。

  2. 重试机制:对于某些错误,比如网络请求失败,提供重试选项。

  3. 日志记录:记录详细的错误日志,以便于开发者调试和追踪问题。

  4. 用户友好的提示:使用用户友好的语言来描述错误,避免技术性的错误代码或消息。

  5. 异常链:在捕获异常时保留原始异常信息,以便于调试。

以下是对Java代码的进一步细化:

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;
import android.widget.Toast;
import android.content.DialogInterface;
import android.app.AlertDialog;
import android.content.Context;
import android.util.Log;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;public class MyActivity extends Activity {private static final String TAG = "MyActivity";private EditText inputEditText;private TextView resultTextView;private Button submitButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);inputEditText = (EditText) findViewById(R.id.input_edit_text);resultTextView = (TextView) findViewById(R.id.result_text_view);submitButton = (Button) findViewById(R.id.submit_button);submitButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String userInput = inputEditText.getText().toString();if (!isNetworkAvailable()) {showNetworkErrorDialog();return;}try {saveInputToDatabase(userInput);resultTextView.setText("输入已保存: " + userInput);} catch (SQLiteException e) {Log.e(TAG, "Database error", e);showErrorDialog("保存输入时发生数据库错误,请稍后再试。");}}});}private boolean isNetworkAvailable() {ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo activeNetwork = cm.getActiveNetworkInfo();return activeNetwork != null && activeNetwork.isConnected();}private void showNetworkErrorDialog() {String message = "当前没有网络连接。请检查您的网络设置。";new AlertDialog.Builder(this).setMessage(message).setPositiveButton("重试", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// 可能在这里刷新UI或重新尝试操作}}).setNegativeButton("取消", null).create().show();}private void saveInputToDatabase(String input) throws SQLiteException {SQLiteDatabase db = ...; // 获取数据库连接db.beginTransaction();try {ContentValues values = new ContentValues();values.put("input_data", input);db.insert("user_inputs", null, values);db.setTransactionSuccessful();} catch (SQLiteException e) {// 可以在这里记录更详细的错误信息throw new SQLiteException("Failed to insert data", e);} finally {db.endTransaction();db.close();}}private void showErrorDialog(String message) {new AlertDialog.Builder(this).setMessage(message).setPositiveButton("确定", null).create().show();}
}

在这段代码中,我们使用Log.e来记录错误日志,这对于开发者在测试和维护应用时非常有帮助。我们还使用了SQLiteException的链式抛出,这样在捕获异常时可以保留原始异常的堆栈信息。

此外,我们在网络错误对话框中提供了一个“重试”按钮,允许用户在检查网络设置后重新尝试操作。在数据库错误的情况下,我们通过showErrorDialog提供了一个对话框,告知用户操作失败,并建议他们稍后再试。

最后,我们使用Toast来提供轻量级的用户反馈,例如在成功保存数据后显示一个简短的消息。

这些细化的错误处理和用户反馈机制有助于提升应用的健壮性和用户体验。

http://www.lryc.cn/news/382987.html

相关文章:

  • 数据处理技术影响皮质-皮质间诱发电位的量化
  • ResultSet的作用和类型
  • 计算机网络:运输层 - TCP首部格式 连接的创建与释放
  • 妈耶!被夸爆的零售数据分析方案在这里
  • AI探索:最佳落地应用场景
  • 2024年最新机动车签字授权人考试题库。
  • 软RAID
  • IDEA 学习之 启动“卡死”
  • 豆瓣高分项目管理书籍推荐
  • 关于docker存储overlay2相关问题
  • 实现批量自动化电商数据采集|商品详情页面|店铺商品信息|订单详情数据
  • ES6(ECMAScript 6.0) 新特性
  • 性能工具之 JMeter 常用组件介绍(八)
  • 分布式锁(Redission)
  • 【ARMv8/v9 GIC 系列 3 -- GIC 的 类型寄存器 GICD_TYPER】
  • MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)
  • 打造智能家居:用ESP32轻松实现无线控制与环境监测
  • 大型Web应用的模块化与组织实践:Flask Blueprints深入解析
  • AI 智算产业发展现状和预测报告
  • 【软件工具】Xshell安装教程
  • git如何切换到tag分支
  • 【启明智显产品介绍】Model3C工业级HMI芯片详解专题(三)通信接口
  • Mysql实战中的一些小tips
  • 【Linux】使用信号进行进程间通信
  • 电脑实用技巧1
  • 【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理
  • 面试-java多线程与并发
  • 前端学习-day10
  • 深入理解桥接模式(Bridge Pattern)及其实际应用
  • Springboot + Mybatis 实现sql打印