当前位置: 首页 > 知识库问答 >
问题:

错误应用程序可能在其主线程上做了太多工作[重复]

鲁才艺
2023-03-14

我不知道为什么这个错误不断出现。这是我的全班同学;

public class MainActivity extends Activity {

// will show the statuses
TextView myLabel;

// will enable user to enter any text to be printed
EditText myTextbox;

// android built in classes for bluetooth operations
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;

OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;

byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {

        // we are goin to have three buttons for specific functions
        Button openButton = (Button) findViewById(R.id.open);
        Button sendButton = (Button) findViewById(R.id.send);
        Button closeButton = (Button) findViewById(R.id.close);

        myLabel = (TextView) findViewById(R.id.label);
        myTextbox = (EditText) findViewById(R.id.entry);

        // open bluetooth connection
        openButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    findBT();
                    openBT();
                } catch (IOException ex) {
                }
            }
        });

        // send data typed by the user to be printed
        sendButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    sendData();
                } catch (IOException ex) {
                }
            }
        });

        // close bluetooth connection
        closeButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    closeBT();
                } catch (IOException ex) {
                }
            }
        });

    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/*
 * This will find a bluetooth printer device
 */
void findBT() {

    try {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        if (mBluetoothAdapter == null) {
            myLabel.setText("No bluetooth adapter available");
        }

        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBluetooth = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth, 0);
        }

        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                .getBondedDevices();
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {

                // MP300 is the name of the bluetooth printer device
                if (device.getName().equals("Star Micronics")) {
                    mmDevice = device;
                    break;
                }
            }
        }
        myLabel.setText("Bluetooth Device Found");
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/*
 * Tries to open a connection to the bluetooth printer device
 */
void openBT() throws IOException {
    try {
        // Standard SerialPortService ID
        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
        mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
        mmSocket.connect();
        mmOutputStream = mmSocket.getOutputStream();
        mmInputStream = mmSocket.getInputStream();

        beginListenForData();

        myLabel.setText("Bluetooth Opened");
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/*
 * After opening a connection to bluetooth printer device, 
 * we have to listen and check if a data were sent to be printed.
 */
void beginListenForData() {
    try {
        final Handler handler = new Handler();

        // This is the ASCII code for a newline character
        final byte delimiter = 10;

        stopWorker = false;
        readBufferPosition = 0;
        readBuffer = new byte[1024];

        workerThread = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()
                        && !stopWorker) {

                    try {

                        int bytesAvailable = mmInputStream.available();
                        if (bytesAvailable > 0) {
                            byte[] packetBytes = new byte[bytesAvailable];
                            mmInputStream.read(packetBytes);
                            for (int i = 0; i < bytesAvailable; i++) {
                                byte b = packetBytes[i];
                                if (b == delimiter) {
                                    byte[] encodedBytes = new byte[readBufferPosition];
                                    System.arraycopy(readBuffer, 0,
                                            encodedBytes, 0,
                                            encodedBytes.length);
                                    final String data = new String(
                                            encodedBytes, "US-ASCII");
                                    readBufferPosition = 0;

                                    handler.post(new Runnable() {
                                        public void run() {
                                            myLabel.setText(data);
                                        }
                                    });
                                } else {
                                    readBuffer[readBufferPosition++] = b;
                                }
                            }
                        }

                    } catch (IOException ex) {
                        stopWorker = true;
                    }

                }
            }
        });

        workerThread.start();
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
/*
 * Close the connection to bluetooth printer.
 */
void closeBT() throws IOException {
    try {
        stopWorker = true;
        mmOutputStream.close();
        mmInputStream.close();
        mmSocket.close();
        myLabel.setText("Bluetooth Closed");
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
/*
 * This will send data to be printed by the bluetooth printer
 */
void sendData() throws IOException {
    try {

        // the text typed by the user
        String msg = myTextbox.getText().toString();
        msg += "\n";

        mmOutputStream.write(msg.getBytes());

        // tell the user data were sent
        myLabel.setText("Data Sent");
        closeBT();
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


}//End of class

这个代码段是一个单类应用程序,它应该打印写入文本字段的任何内容,但当我检查成对的设备时,它会给出标题错误。

有什么建议为什么??

共有1个答案

端木皓君
2023-03-14

如果您在主线程上执行繁重的网络操作,则会出现此错误。我的意思是在您的类中不使用任何异步任务或处理程序,您正在执行网络操作。

所以,当您要在应用程序中进行网络调用以下载、将设备中的内容发布到服务器等时,请使用尽可能多的handler或asynctask。

 类似资料:
  • 当我在emulator上启动应用程序时,我发现以下消息 我看到有很多类似的问题,但每个问题都有不同的解决方案。Tnx很多! 日志猫 搜索ictionary.java WordActivity.java 字典提供程序。Java语言 公共类DictionaryProvider扩展ContentProvider{String TAG="DictionaryProvider";

  • 我对Android非常陌生,在我的应用程序中,当我点击添加在碎片类上的按钮时,我在活动上添加了碎片,我在我的日志猫上得到警告,如下所示- 跳过91帧!应用程序可能在其主线程上做了太多工作。 请帮帮我我该怎么解决这个?

  • 我正在开发一个日历应用程序,并使用textview作为日历单元格,当我启动应用程序后检查logcat时,我发现来自Choreographer的消息“跳过了76帧!应用程序可能在其主线程上做了太多工作”。我知道我正在创建很多文本视图(120),但如何在不影响应用程序性能的情况下构建日历呢?是否有其他方法可以构建支持活动的日历?

  • 我有以下错误 关于它的研究。。。确保使用Runnable尽可能多地在新线程中启动所有内容。但不断地出错。我几乎注释了我所有的代码,但在我开始一个新活动时仍然得到了它。然后,我对第一次活动中的这个mapfragment进行了注释,错误就消失了。因此,错误是由以下代码引起的: 我从Android文档的谷歌地图API中得到了这个。。。有点奇怪,它没有得到优化。如何确保错误消失?我可以延迟mapFragm

  • 我是Android SDK/API环境的新手。这是我第一次试着画一张图/图表。我尝试使用3个不同的免费库在模拟器上运行不同类型的示例代码,但布局屏幕上没有显示任何内容。logcat将重复以下消息: 当我运行与一个许可库的评估副本相关的示例代码时,问题并没有持续存在,并且图表工作了。

  • 您好,我正在开发一个android应用程序,当我尝试从我的应用程序发送电子邮件时,我会遇到这个错误。基于此链接,我在后台发送邮件而不使用意图 我的程序: 当我直接指定收件人的电子邮件地址时,应用程序工作正常。当我将其指定为存储收件人电子邮件地址的字符串数组时,问题就来了。 Logcat显示: 跳过222帧!应用程序可能在其主线程上做了太多工作。 谁能告诉我到底是什么问题?