【问题标题】:App keeps crashing cause of broadcastreceiver应用程序不断崩溃的广播接收器原因
【发布时间】:2021-07-26 20:31:48
【问题描述】:

谁能帮我调试我的代码的哪一部分是它不断崩溃的原因?我一直在试图找出哪个部分是错误的,我在网上获取了代码并自己应用了它,但是我在这部分遇到了麻烦,它一直说 app 是 我创建了不同的函数来找出哪个部分是错误的,谢谢。

在我的 logcat 中它说: 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.String.intern()”

主要活动

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    private TextView tv_time;
    private TextView tv_amount;
    private ImageView iv_status_01;
    private ImageView iv_status_02;
    private ImageView iv_status_03;
    private ImageView iv_status_04;
    private ImageView iv_status_05;
    private ImageView iv_status_06;
    private ImageView iv_complete;



    private Intent serviceInent = null;


    public static String status1;
    public static String status2;
    public static String status3;
    public static String status4;
    public static String status5;
    public static String status6;

    private IntentFilter intentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction(status1);
        intentFilter.addAction(status2);
        intentFilter.addAction(status3);
        intentFilter.addAction(status4);
        intentFilter.addAction(status5);
        intentFilter.addAction(status6);

        init();
    }

    private void init(){
        tv_amount = findViewById(R.id.tv_amount);
        tv_time = findViewById(R.id.tv_time);

        Date date = new Date();
        Locale philippineLocale = new Locale.Builder().setLanguage("en").setRegion("PH").build();

        tv_time.setText(getDate(date, philippineLocale));

        tv_amount.setText("Total Amount :\n500.00");
        serviceInent = new Intent(this, DeliveryService.class);
        startService(new Intent(this, DeliveryService.class));
    }

    private String getDate(Date date, Locale locale) {
        DateFormat formatter = new SimpleDateFormat("EEEE \nMMMM dd, yyyy", locale);
        return formatter.format(date);
    }
    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(mReceiver, intentFilter);
    }

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(status1)) {
                iv_status_01.setImageResource(R.drawable.box_check);
            }
            else if (intent.getAction().equals(status2)) {
                iv_status_02.setImageResource(R.drawable.box_check);
            }
            else if (intent.getAction().equals(status3)) {
                iv_status_03.setImageResource(R.drawable.box_check);
            }
            else if (intent.getAction().equals(status4)) {
                iv_status_04.setImageResource(R.drawable.box_check);
            }
            else if (intent.getAction().equals(status5)) {
                iv_status_05.setImageResource(R.drawable.box_check);
            }
            else if (intent.getAction().equals(status5)) {
                iv_status_06.setImageResource(R.drawable.box_check);
            }
        }
    };

    @Override
    protected void onPause() {
        unregisterReceiver(mReceiver);
        super.onPause();
    }
}

送货服务:

import android.annotation.TargetApi;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;

public class DeliveryService extends Service {

    private String LOG_TAG = null;


    @Override
    public void onCreate() {
        super.onCreate();
        LOG_TAG = this.getClass().getSimpleName();
        Log.i(LOG_TAG, "In onCreate");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(LOG_TAG, "In onStartCommand");
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction(MainActivity.status1);
                sendBroadcast(broadcastIntent);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                broadcastIntent.setAction(MainActivity.status2);
                sendBroadcast(broadcastIntent);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                broadcastIntent.setAction(MainActivity.status3);
                sendBroadcast(broadcastIntent);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                broadcastIntent.setAction(MainActivity.status4);
                sendBroadcast(broadcastIntent);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                broadcastIntent.setAction(MainActivity.status5);
                sendBroadcast(broadcastIntent);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                broadcastIntent.setAction(MainActivity.status6);
                sendBroadcast(broadcastIntent);
            }
        }).start();
        return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(LOG_TAG, "In onBind");
        return null;
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        Log.i(LOG_TAG, "In onTaskRemoved");
    }

    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "In onDestroy");
    }
}

谢谢。

【问题讨论】:

  • 您能否显示更多日志,以查看问题的确切位置

标签: java android android-studio broadcast


【解决方案1】:

您应该初始化用作操作的字符串(如 status1);否则会抛出 NullProinterException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多