Android - 通过广播意图传递长数组

3
我写了一个小的安卓程序,其中包含一个主活动和一个广播监听器,并创建了另一个线程。该线程搜索素数,并将其加载到长整型数组列表中,每隔3秒钟通过广播将填充好的数组发送到主活动。一切都很好,直到我尝试从意图中获取长整型数组额外信息,这导致每次空指针异常。 我尝试使用字符串数组列表,它可以工作,但我很好奇为什么意图有一个“getlongarrayextra”方法。
这是我的代码: public class MainActivity extends Activity {
public static String BROADCAST_THREAD_KEY = "broadcast_key";
public static String EXTRAARRAYID = "primes";
private static long MAXNUM = 2000000;
private PrimeCalculatorThread thread;
TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.numberstext);
}

private BroadcastReceiver receiver = new BroadcastReceiver() {
    public void onReceive(android.content.Context context,
            android.content.Intent intent) {
        String origitext = textView.getText().toString();
        long[] primes = intent.getExtras().getLongArray(EXTRAARRAYID);
        Log.d("ASD", "broadcast received" + primes.toString());
        StringBuilder builder = new StringBuilder();
        if (primes != null) {
            for (long prime : primes) {
                builder.append(prime + " - ");
            }
            textView.setText(origitext + "\n" + builder.toString());
        }

    };
};

@Override
protected void onResume() {
    Log.d("ASD", "ONRESUME");
    initReceiverAndStartThread();
    super.onResume();
}

private void initReceiverAndStartThread() {
    IntentFilter filter = new IntentFilter(BROADCAST_THREAD_KEY);
    registerReceiver(receiver, filter);
    thread = new PrimeCalculatorThread(getBaseContext(), MAXNUM);
    thread.start();
    Log.d("ASD", "THREAD STARTED");
}

第二个线程:

public class PrimeCalculatorThread extends Thread {

这是一个计算质数的线程类。

private Context context;
private long maxnum;
List<Long> primes;
boolean isrunning;

public void setIsrunning(boolean isrunning) {
    this.isrunning = isrunning;
}

private long counter = 0;
private long DELAYBETWEENBROADCAST = 3000;

public PrimeCalculatorThread(Context c, long maxnum) {
    this.context = c;
    this.maxnum = maxnum;
    primes = new ArrayList<Long>();
}

@Override
public void run() {
    long startTime = System.currentTimeMillis();
    long estimatedTime;
    isrunning = true;
    for (long i = 0; i < maxnum; i++) {
        Log.d("ASD", Boolean.toString(isrunning));
        if (!isrunning)
            break;
        Log.d("ASD", i + "");
        estimatedTime = System.currentTimeMillis() - startTime;
        if (isPrime(i)) {
            primes.add(i);
            Log.d("ASD", i + "is a prime");
        } else {
            Log.d("ASD", i + "is not a prime");
        }
        if (estimatedTime > counter * DELAYBETWEENBROADCAST
                + DELAYBETWEENBROADCAST) { // elapsed another period
            Log.d("ASD", primes.toString() + " will be sending.");
            sendBroadCast();
            primes.clear();
            counter++;
        }
        try {                       //for debug purposes
            Thread.sleep(250);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void sendBroadCast() {
    Intent intent = new Intent(MainActivity.BROADCAST_THREAD_KEY);
    intent.putExtra(MainActivity.EXTRAARRAYID, primes.toArray());
    context.sendBroadcast(intent);
    Log.d("ASD", "BROADCAST SENT" + primes.toString());
}

boolean isPrime(long n) {
    if (n < 2)
        return false;
    if (n == 2 || n == 3)
        return true;
    if (n % 2 == 0 || n % 3 == 0)
        return false;
    long sqrtN = (long) Math.sqrt(n) + 1;
    for (long i = 6L; i <= sqrtN; i += 6) {
        if (n % (i - 1) == 0 || n % (i + 1) == 0)
            return false;
    }
    return true;
}

}

1个回答

4
问题在于你正在管理一个Long对象列表,并将其传递给putExtra,这意味着你正在调用putExtra(String name, Serializable value)。然后你尝试使用getLongArray()获取该值,但你没有放置任何长数组额外的内容,你看到了吗!要解决这个问题,请替换。
intent.putExtra(MainActivity.EXTRAARRAYID, primes.toArray());

使用

long[] primesArray = new long[primes.size()];
for (int i = 0; i < primes.size(); i++) {
    primesArray[i] = primes.get(i);
}
intent.putExtra(MainActivity.EXTRAARRAYID, primesArray);

这将调用正确的putExtra(String name, long[] value)方法。

哇!我发现了相同的问题。 - Lei Guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接