第十四站: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; // 无网络连接
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        // 请求权限
        // ... 省略之前的代码

        // 设置按钮点击监听器
        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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;

    @Override
    protected 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() {
            @Override
            public 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来提供轻量级的用户反馈,例如在成功保存数据后显示一个简短的消息。

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

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值