java - 在 UI 线程中声明一个字符串数组,然后从后台线程填充它
问题描述
您好,我目前正在开发一个 android 银行应用程序项目。
我有两个线程 UI 和 bankThread 作为后台线程运行来执行所有必要的银行操作。
在这个活动中,我使用字符串数组来扩充列表视图,以便用户可以查看在他们的帐户上进行的交易。
我已经在 Ui 线程中声明了这些字符串数组,然后使用银行线程中的处理程序来填充它们,但是在我完成此操作之后,这些数组都返回 null 并且应用程序由于空指针异常而崩溃。
我已经使用 Localbroadcastmanager 将这些字符串数组作为广播发送到另一个类中,并且它工作得很好,但是在这个类中,字符串数组仍然保持为空。
关于如何解决这个问题的任何想法?
编码:
public class ViewTransactionsActivity extends AppCompatActivity {
ListView transactionsListView;
public static volatile String[] tranDates;
static volatile String[] tranTypes;
static volatile String[] tranDescs;
static volatile String[] tranAmounts;
BankThread bankThread;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_transactions);
bankThread = MainActivity.getBankThread();
transactionsListView = (ListView) findViewById(R.id.transaction_list_view);
final TextView errorTextView = (TextView) findViewById(R.id.view_transactions_error_text);
bankThread.handler.post(new Runnable() {
@Override
public void run() {
tranDates = bank.getAccTranDate();
tranTypes = bank.getAccTranTypes();
tranAmounts = bank.getAccTranAmount();
tranDescs = bank.getAccTranDesc();
Intent tranArraysIntent = new Intent("getTransactionInfo");
tranArraysIntent.putExtra("theTypes", tranTypes);
tranArraysIntent.putExtra("theDates", tranDates);
tranArraysIntent.putExtra("theAmounts", tranAmounts);
tranArraysIntent.putExtra("theDesc", tranDescs);
if (tranAmounts != null || tranDates != null || tranDescs != null || tranTypes != null)
errorTextView.setText("Alls grand.");
LocalBroadcastManager.getInstance(mContext).sendBroadcast(tranArraysIntent);
}
});
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter("getTransactionInfo"));
if(tranAmounts != null || tranDates != null || tranDescs != null || tranTypes != null) {
TransactionAdapter transactionAdapter = new TransactionAdapter(this, tranTypes, tranAmounts, tranDescs, tranDates);
transactionsListView.setAdapter(transactionAdapter);
errorTextView.setText("Complete.");
}else{
errorTextView.setText("A boo-boo has occurred.");
}
}
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
tranTypes = intent.getStringArrayExtra("theTypes");
tranAmounts = intent.getStringArrayExtra("theAmounts");
tranDates = intent.getStringArrayExtra("theDates");
tranDescs = intent.getStringArrayExtra("theDesc");
}
};
}
这是错误堆栈跟踪:
02-18 21:35:44.198 28081-28081/com.example.mk.bankapptest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mk.bankapptest, PID: 28081
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mk.bankapptest/com.example.mk.bankapptest.ViewTransactionsActivity}: java.lang.NullPointerException: Attempt to read from null array
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to read from null array
at com.example.mk.bankapptest.ViewTransactionsActivity.onCreate(ViewTransactionsActivity.java:56)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
解决方案
你的问题在这里:
errorTextView.setText(tranDates[0]);
此时,tranDates
为空。
您应该将此行放在 Runnable 中(或直接删除该行)。
问候
推荐阅读
- java - 我应该选择哪种方式使类线程安全?
- reactjs - 视口中的中心弹出框
- python - Pandas 为列中的连续值分配累积计数
- javascript - react-native 如何从html内容中删除空格?
- wpf - 如何从 Windows Presentation Framework(.Net) 的标题栏中删除图标?
- android - 仅在发布版本中在 android 中获取 Parcelable 错误
- java - 在 excel 中更改其他单元格值时更改单元格值 [通过 Apache POI 进行数据验证]
- python - 仅保存 Python 程序中最后一个对象的对象列表
- regex - 如何在VScode中选择所有打印语句
- node.js - 为什么我的选择语句在工作更新语句之后返回旧数据?