簡體   English   中英

在 UI 線程中聲明一個字符串數組,然后從后台線程填充它

[英]Declaring a string array in the UI thread then populating it from the background thread

您好,我目前正在開發一個 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 中(或直接刪除該行)。

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM