【问题标题】:variable return null after method finished方法完成后变量返回null
【发布时间】:2019-10-19 20:42:27
【问题描述】:

我正在尝试制作一个翻译文本并打印结果的函数。我正在使用 firebasetranslator。

通过调试,应用程序启动但文本框为空。试图在上面做标记

private void setRisultato(String string){
            this.risultato = string;
}

我看到翻译后的文本已正确分配给结果变量。 但是如果我把标记放上去

public String getRisultato(){
    return risultato;
}

我看到什么结果是空的(不是空的),有人能解释一下为什么吗?

更新:

Traduttore.java

import android.app.Activity;
import androidx.annotation.NonNull;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.ml.common.modeldownload.FirebaseModelDownloadConditions;
import com.google.firebase.ml.naturallanguage.FirebaseNaturalLanguage;
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslateLanguage;
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslator;
import com.google.firebase.ml.naturallanguage.translate.FirebaseTranslatorOptions;


public class Traduttore extends Activity {
    private static String text1;

    public interface callbacktranslate {
        void onCallback(String risultato);
    }
    public void traduci(String textblock, final callbacktranslate callback){
        //clear string and start translate
        String blocktext = textblock.replaceAll("\n"," ");
        String blocktext2 = blocktext.replaceAll("\\.","");
        String blocktext3 = blocktext2.toUpperCase();
        text1 = blocktext3;
        downloadTranslatorAndTranslate(callback);
    }
    public void translateText(FirebaseTranslator langTranslator, final callbacktranslate callback) {
        //translate source text to english
        langTranslator.translate(text1).addOnSuccessListener(
                        new OnSuccessListener<String>() {
                            @Override
                            public void onSuccess(@NonNull String translatedText) {
                                //make variable all uppercase and save it
                                String blocktext4 = translatedText.toUpperCase();
                                callback.onCallback(blocktext4);
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                            }
                        });
    }
    public void downloadTranslatorAndTranslate(final callbacktranslate callback) {
        int sourceLanguage = 11; //language source(en=11)
        //create translator for source and target languages
        FirebaseTranslatorOptions options =
                new FirebaseTranslatorOptions.Builder()
                        .setSourceLanguage(sourceLanguage)
                        .setTargetLanguage(FirebaseTranslateLanguage.IT)
                        .build();
        final FirebaseTranslator langTranslator =
                FirebaseNaturalLanguage.getInstance().getTranslator(options);
        //download language models if needed
        FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder()
                .build();
        langTranslator.downloadModelIfNeeded(conditions)
                .addOnSuccessListener(
                        new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void v) {
                                translateText(langTranslator,callback);
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                            }
                        });
    }
}

MainActivity.java 中的方法:

public ConstraintLayout vpp;
public TextView[] textViewArray = new TextView[500];
public int i;

public void StartReadImage(){
    FirebaseVisionImage image2 = FirebaseVisionImage.fromBitmap(resizedBitmap);
    FirebaseVisionTextRecognizer textRecognizer2 = FirebaseVision.getInstance()
            .getOnDeviceTextRecognizer();
    final Task<FirebaseVisionText> result2 =
            textRecognizer2.processImage(image2)
                    .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                        @Override
                        public void onSuccess(FirebaseVisionText firebaseVisionText) {
                            // Task completed successfully
                           i = 0;
                            resultText = firebaseVisionText.getText();

                            for (FirebaseVisionText.TextBlock block: firebaseVisionText.getTextBlocks()) {
                                String blockText = block.getText();
                                Float blockConfidence = block.getConfidence();
                                List<RecognizedLanguage> blockLanguages = block.getRecognizedLanguages();

                                final  Point[] blockCornerPoints = block.getCornerPoints();
                                final  Rect blockFrame = block.getBoundingBox();

                                traduttore.traduci(blockText, new Traduttore.callbacktranslate() {
                                    @Override
                                    public void onCallback(String result) {
                                        createCover(blockCornerPoints, blockFrame, result, i);
                                        i++;
                                    }
                                });
                            }
                        }
                    })
                    .addOnFailureListener(
                            new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    // Task failed with an exception
                                }
                            });
}
public void createCover(Point[] CornerPoint,Rect blockFrame,String blockText, int i){

            textViewArray[i] = new TextView(context);
            textViewArray[i].setTextSize(9);
            textViewArray[i].setGravity(Gravity.CENTER);
            textViewArray[i].setTextColor(Color.BLACK);
            textViewArray[i].setBackgroundColor(Color.rgb(225, 225, 225));
            textViewArray[i].setHeight(blockFrame.height());
            textViewArray[i].setWidth(blockFrame.width());
            textViewArray[i].setX(CornerPoint[0].x);
            textViewArray[i].setY(CornerPoint[0].y);

            textViewArray[i].setText(blockText);
            vpp.addView(textViewArray[i]);
}

【问题讨论】:

  • 因为 asynchronous translate() 方法还没有完成翻译,所以Success Listener 还没有被调用(或者它失败了)。 --- 实际上,异步下载还没有完成,所以translateText()方法还没有被调用。 --- 你的Traduciblocco() 方法不能同步得到结果。重新思考你的逻辑。
  • 看看这个以获得一些帮助:stackoverflow.com/questions/57330766/…
  • 如果您看到 setter 被调用并正确分配变量,但在 getter 中它为空,您可能会遇到 risultato 变量是静态的问题,因此在类的所有实例之间共享而你在某处覆盖它。
  • 哦,好的,明白了,现在我尝试修复它,我想我明白了.. 谢谢!
  • 按照实现回调的指南,我已经在帖子中编辑了代码,但我现在不明白如何调用变量..我所做的正确吗?

标签: java android firebase-mlkit


【解决方案1】:

你需要在某个地方设置回调,为了做到这一点,你需要在几个地方添加它,并适当地传递它

traduci(String textblock, final Callback callback)

downloadTranslatorAndTranslate(final Callback callback)

translateText(FirebaseTranslator langTranslator, final Callback callback)

从那里,您需要将回调添加到 Activity 方法调用中,并且该方法应该是无效的,因为回调是在方法实际返回时出现的

public void Traduciblocco(String abc){
    traduttore.traduci(abc, new Callback() {
        @Override 
        public void onCallback(String result) {
            // resultTxt.setText(result); 
        } 
    });
}

【讨论】:

  • 我在帖子上再次编辑了代码,但现在它给了我另一个错误:“错误:方法没有覆盖或实现超类型的方法”在 MainActivity 的 TraduciBlocco 的 @Override 和“错误: 不兼容的类型: 不能转换为 com.test.testTraduttore.Traduttore.Callback" 实际上 onCallback 从来没有使用过,应该参考translator.java中的onCallback 对吧?
  • 查看import语句并使用正确的Callback类
  • 好的,我解决了这个问题,现在变量正确返回,问题是我必须将该字符串插入以编程方式创建的文本视图数组中,但如果我在回调方法中创建所有文本视图,所有文本视图都作为文本相同,只有最后一个文本.. 但是如果我将所有代码放在回调方法之外(没有翻译),所有文本视图都有我们的文本,可能是什么原因?我在帖子中更新了代码
  • 好吧,在回调中你总是在创建一个新数组。那将是一个问题。所以将数组定义移出回调,然后只做 onCallback 内的 i++
  • 试图将定义放在类定义上,结果是一样的(确保我再次在帖子中编辑代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多