Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:如何创建一个二维数组的副本以在另一个线程中使用?_Java_Android_Arrays_Multithreading_Android Asynctask - Fatal编程技术网

Java Android:如何创建一个二维数组的副本以在另一个线程中使用?

Java Android:如何创建一个二维数组的副本以在另一个线程中使用?,java,android,arrays,multithreading,android-asynctask,Java,Android,Arrays,Multithreading,Android Asynctask,我已经创建了一个基本的日志类,其中当前是一个二维数组,它存储多达100个事件的日志信息(然后开始写入信息,所以我只在其中保留最后100个事件) 在某一级别的日志事件上,此数组数据将转储到AsyncTask线程上的数据库中 目前,数组是在类级别定义的,因此AsyncTask线程正在访问GUI线程正在访问的同一个数组(这给了我NullPointerException,这是应该的) 我需要一种方法,在AsyncTask线程启动时复制数组的值,这样后台线程就可以读取所有数据并正确地将其发送到数据库——这

我已经创建了一个基本的日志类,其中当前是一个二维数组,它存储多达100个事件的日志信息(然后开始写入信息,所以我只在其中保留最后100个事件)

在某一级别的日志事件上,此数组数据将转储到AsyncTask线程上的数据库中

目前,数组是在类级别定义的,因此AsyncTask线程正在访问GUI线程正在访问的同一个数组(这给了我NullPointerException,这是应该的)

我需要一种方法,在AsyncTask线程启动时复制数组的值,这样后台线程就可以读取所有数据并正确地将其发送到数据库——这就是我所要解决的问题

// Defined in the class
private static String[][] logHistory = new String[100][6];


// Class to log errors to a database
private static class asyncLog extends AsyncTask<Void,Void,Void>
{
    // This is the background thread
    @Override
    protected Void doInBackground(Void... params)
    {
        Thread.currentThread().setName("LogToDB.asyncLog.doInBackground");              

        // Make a copy of the array in its current state
        final String[][] logTemp = new String[100][6];
        for (int i = 0; i < 100; i++) 
        {
              for (int j = 0; j < 6; j++) 
              {
                logTemp[i][j]=logHistory[i][j];
              }
        }

        // ...snip
    }
}
java:558是对Insert方法的调用

java:387是Insert方法

LogToDB.java:393是突出显示的行:

Statement stmt=null;

try 
{
    stmt=dbConn.createStatement(); // This line
    stmt.executeUpdate(sql);
}  

我将假设您正在尝试的是创建一个事件的“幻影日志”,它只在出现一些不希望出现的情况时才会被转储,这样您就不会弄乱主日志,而是可以在发生错误时查看详细信息。如果是这样的话,我会这样做:

  • 定义一个类
    LogMessage
    ,该类包含有关消息的必要信息,通常是
    字符串
    和日志级别(应该是
    枚举
    ),可能包含一个
    可丢弃的字段。请参阅log4j和slf4j,了解此接口通常的外观示例
  • 定义一个固定长度的缓冲类;不幸的是,虽然1.6并发API有支持固定长度队列的接口,但我无法找到一个好的、高效的实现。最好的选择在很大程度上取决于读取和转储的频率,但我首先要做一些事情,比如分配一个固定大小的数组,使用
    AtomicInteger
    作为数组索引。标准(无限大小)实现基于。对此数组的引用需要是
    volatile
    或由
    原子引用支持
  • 当跟踪日志级别的“漏斗”API看到具有适当重要性的日志消息时,它会以原子方式交换整个日志结构,并启动一个作业来转储它。如果您正在登录一个可能会被多个日志线程弄糊涂的工具,您甚至可能会将整个日志缓冲区提交到一个
    BlockingQueue
    ,一个长时间运行的转储线程从中读取

  • 等等,你为什么要得到NPE?你问题的那部分毫无意义。试试其他的帖子!!!例如,你做出了错误的假设。字段的最后一个修饰符不会导致抛出异常。发布异常的准确完整堆栈跟踪,并询问我们为什么抛出异常以及如何修复异常。您的数组副本是正确的。旁注:不要使用多维数组来包含日志数据。创建一个类,例如
    LogItem
    ,它包含每个日志记录事件所需的信息,并将这些信息存储在
    列表中(或者存储在一个数组中)。那么,在这一行什么可以为空
    dbConn
    是唯一的可能性。所以你忘了初始化dbConn了。我把这个标记为答案,因为它帮助我找到了真正的问题,使我的代码更加可靠。感谢所有帮助过我的人:)
    Statement stmt=null;
    
    try 
    {
        stmt=dbConn.createStatement(); // This line
        stmt.executeUpdate(sql);
    }