有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android广播接收器作为传递字符串的内部静态类

如果需要,您可能想跳转到更新2并检查代码

我正在构建一个条形码扫描器,在传递从内部类(将BroadcastReceiver扩展到MainActivity类)捕获的数据时遇到困难,我确实理解静态和非静态对象之间的区别,但我被卡住了

无法从内部类调用逻辑方法

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
protected void onCreate(Bundle savedInstanceState){...}

public void Logic(String result){// Do something...}

//Inner Class
   public static class ScanResultReceiver extends BroadcastReceiver {
   @Override
    public void onReceive(Context context, Intent intent) {...
      // data here captured fine! 
     // Here I want to send my data to MainActivity Logic(result)
     Logic(result);
    }
 }

如果我将“Logic()”作为静态方法,那么在从Toaster/variables从静态方法调用非静态方法时会出现很多错误。。等

更新

这个方法在MainActivity内部,我确实想从内部类调用它

public  void Logic(String result) throws Exception {
            //prepare the results
            if (mDecodeResult.decodeValue.substring(0, 1).equals("{") && mDecodeResult.decodeValue.substring(mDecodeResult.decodeValue.length() - 1).equals("}")) {
                if (!(mDecodeResult.decodeValue.equals("SCAN AGAIN"))) {
                    mDecodeResult.decodeValue = mDecodeResult.decodeValue.substring(1);
                    mDecodeResult.decodeValue = mDecodeResult.decodeValue.substring(0, mDecodeResult.decodeValue.length() - 1);
                }
            }
            if (mDecodeResult.decodeValue.equals("SCAN AGAIN")) {
                Toast toast = Toast.makeText(getApplicationContext(),
                        "No scan data received! Please Scan Again", Toast.LENGTH_SHORT);
                toast.show();
            } else if (mDecodeResult.decodeValue != null && tourFlag) {
                String formattedDate = getTime();
                String scanContent = mDecodeResult.decodeValue;
                boolean found = false;
                if (ForcedOrRandom.equals("Random")) {
                    String[] b;
                    for (String l : ToBeScanned) {
                        b = l.split(":");
                        if (scanContent.equals(b[0])) {
                            Log.d("remove", "scanned: " + scanContent);
                            Log.d("remove", "remove : " + b[0]);
                            found = true;
                        }
                    }
                } else if (ForcedOrRandom.equals("Forced")) {
                    String[] b;
                    for (String I : FTobeScannedNext) {
                        b = I.split(":");
                        if (scanContent.equals(b[0])) {
                            Log.d("remove", "scanned: " + scanContent);
                            Log.d("remove", "remove : " + b[0]);
                            found = true;
                        }
                    }
                }// end Skip/Forced
                if (listLoaded && found) {
                    theResult[resultCount].setTourID(currentTourId);
                    theResult[resultCount].setBarcode(scanContent);
                    BarcodeObject a = getBarcodeInfo(scanContent);
                    if (ForcedOrRandom.equals("Random")) {
                    } else {
                        if (myTimer != null) {
                            myTimer.cancel();
                            Timer = (TextView) findViewById(R.id.timertext);
                            Timer.setText("");
                            PlayOrPause.setVisibility(View.INVISIBLE);
                        }
                        boolean isTimed = a.getForceNextBarCode().equals("");
                        if (!(isTimed)) {
                            PlayOrPause = (ImageButton) findViewById(R.id.PlayPause);
                            PlayOrPause.setVisibility(View.VISIBLE);
                            PlayOrPause.setImageResource(R.drawable.pause);
                            final AlertDialog.Builder timealert = new AlertDialog.Builder(this);
                            PlayOrPause.setEnabled(true);
                            long duration = Integer.parseInt(a.getForceNextBarCode());
                            duration = duration * 60000;
                            myTimer = new CountDownTimer(duration, 1000) {
                                @Override
                                public void onTick(long millisuntilFinished) {
                                    int seconds = (int) (millisuntilFinished / 1000) % 60;
                                    int minutes = (int) ((millisuntilFinished / (1000 * 60)) % 60);
                                    Timer = (TextView) findViewById(R.id.timertext);
                                    Timer.setText(minutes + ":" + seconds);
                                    timeLeft = millisuntilFinished;
                                }

                                String value = "";

                                @Override
                                public void onFinish() {
                                    Timer = (TextView) findViewById(R.id.timertext);
                                    theResult[resultCount].setScanstatus(scanStatusTimeElapsed);
                                    timealert.setTitle("Site Secure");
                                    timealert.setMessage("Time Elapsed! Enter reason");
// Set an EditText view to get user input
                                    final EditText input = new EditText(MainActivity.this);
                                    timealert.setView(input);
                                    timealert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int whichButton) {
                                            value = input.getText().toString();
                                            // Do something with value!
                                            while (value.equals("")) {
                                                timealert.setView(input);
                                                timealert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                                    public void onClick(DialogInterface dialog, int whichButton) {
                                                        value = input.getText().toString();
                                                    }
                                                });
                                            }
                                            theResult[resultCount].setComments(value);
                                        }
                                    });
                                    timealert.setIcon(安卓.R.drawable.ic_dialog_alert);
                                    timealert.show();
                                    Timer.setText(R.string.Time_Elapsed);
                                }
                            };
                            myTimer.start();
                        }
                    }

                    theResult[resultCount].setBarcodeID(a.getBarCodeId());
                    theResult[resultCount].setDateScanned(formattedDate);
                    theResult[resultCount].setSkipped(getResources().getString(R.string.Scanned));

                }// end big if listLoaded && found
                contentTxt.setText(scanContent);
                Toaster(getResources().getString(R.string.TScan_Complete));
                if (mainScanCounter == 0) {
                    if (tourDecider(scanContent)) {//tour decider is called to determine if this is boolJanamScanner random or forced tour
                        tourId = scanContent;
                        if (!(readFileOffline(siteSecurePath + "/doneTourNumber.txt").equals(""))) {
                            SYNC.setEnabled(true);
                        }
                    }
                } else if (mainScanCounter > 0) {
                    if (ForcedOrRandom.equals("Random")) {
                        ListManager(scanContent);
                    } else {
                        ForcedListManager(scanContent);
                    }
                }
            } else if (mDecodeResult.decodeValue != null && officerScanFlag) {
                TextView officertextview = (TextView) findViewById(R.id.officerid);
                UserObject theofficer = getUserInfo(mDecodeResult.decodeValue);
                if (theofficer == null) {
                    popUps("Error", "Invalid Officer ID, Please Rescan", "TITLE");
                    officerScan.setEnabled(true);
                } else if (theofficer != null) {
                    // officer ID found need to store it for backup
                    officerId = theofficer.getOfficerid();
                    makeFileOffline(officerId, "officerID");
                    officertextview.setText(theofficer.getUsername());
                    officerScanFlag = false;
                    startTimersOfficerID = getTime();
                    tourBtn.setEnabled(true);
                }
            }
            if (mDecodeResult.decodeValue != null && exceptionFlag) {
                Log.d("check", "exception was clicked");
                String ex_result = mDecodeResult.decodeValue;
                for (int i = 0; i < theExceptions.length; i++) {
                    if (!(theExceptions[i].getBarcode().equals(ex_result))) {
                        String refnum = theExceptions[i].getRefNum();
                        i = theExceptions.length;
                        theResult[resultCount - 1].setException(refnum);
                    }
                }
                exceptionFlag = false;
                Toaster(getResources().getString(R.string.TScan_Complete));
            }
    }    // Logic Ends

更新2

我不确定是否需要另一个线程,但我会将我发现的内容放在下面,我的问题已经缩小到:

我在等待一个叫做

<action 安卓:name="device.scanner.USERMSG" />

经允许

安卓:permission="com.permission.SCANNER_RESULT_RECEIVER"

现在是我的问题

如果用户点击按钮并在不到.5秒的时间内释放onKeyup()事件将在my onReceive()之前触发,my onReceive()位于扩展BroadcastReceiver的静态类内,这会导致问题,因为在更新onReceive()内的字符串之前将调用Logic()

如果用户按住按钮足够长的时间,onReceive将被调用,一切都很好

如何确保始终首先调用onReceive()

 public boolean onKeyUp(int keycode, KeyEvent event) {

        if (keycode == 221 || keycode == 220 || keycode == 222) {
                    Logic(result);     
}
    return true;
    }

共 (1) 个答案

  1. # 1 楼答案

    移动这行代码:

    public void Logic(String result){// Do something...}
    

    在你的class ScanResultReceiver中,它肯定会起作用。您的代码应该如下所示:

    public static class ScanResultReceiver extends BroadcastReceiver {
       public ScanResultReceiver() {
              //empty constructor
       }
    
       @Override
        public void onReceive(Context context, Intent intent) {...
          // data here captured fine! 
         // Here I want to send my data to MainActivity Logic(result)
         Logic(result);
        }
    
        public void Logic(String result){/* ... */}
    }