InfiniteScrollAdapter
の画像にはURLImage
とURLImage.ImageAdapter
の画像が含まれています。SimulatorのInfiniteScrollAdapterのURLImageにはNPE(コードネーム)が表示されます
シミュレータ(Iphone3GSまたはXoomまたはGoogleNexus7)で、InfiniteScrollAdapter
が最初に表示されますが、ファイルはサーバー上に存在します。
注:このテストでは、データベースには1つのエントリしかありませんでした。したがって、下の画像には、同じ行(画像+テキスト)が3回重複して表示されます。ここで
Image tempPlaceholder = Image.createImage(
ParametresGeneraux.SIZE_OF_REPORT_PIC_IN_PX,
ParametresGeneraux.SIZE_OF_REPORT_PIC_IN_PX,
ParametresGeneraux.accentColor);
Graphics gr = tempPlaceholder.getGraphics();
gr.setAntiAliased(true);
gr.setColor(ParametresGeneraux.accentColor);
gr.fillArc(0, 0, ParametresGeneraux.SIZE_OF_REPORT_PIC_IN_PX, ParametresGeneraux.SIZE_OF_REPORT_PIC_IN_PX, 0, 360);
EncodedImage roundPlaceholder = EncodedImage.createFromImage(tempPlaceholder, true);
final Image reportImage = URLImage.createToStorage(
roundPlaceholder,
photoFilenameInStorage,
currentReport.getPhotoPath(),
ParametresGeneraux.RESIZE_SCALE_WITH_ROUND_MASK
);
そして:
は、非表示のアイコンで順序は、私が画像をダウンロードするために使用されるコードがある
を異なる可能性がありますのでご注意くださいオーバーライドされたimageAdapterメソッド:
スタックトレース0public final static URLImage.ImageAdapter RESIZE_SCALE_WITH_ROUND_MASK = new URLImage.ImageAdapter() {
@Override
public EncodedImage adaptImage(EncodedImage downloadedImage, EncodedImage placeholderImage) {
final Image[] tmp = new Image[1];
if (!Display.getInstance().isEdt()) {
// The image scaling has to be called from EDT
Display.getInstance().callSeriallyAndWait(() -> {
tmp[0] = downloadedImage.scaledLargerRatio(placeholderImage.getWidth(), placeholderImage.getHeight());
if (tmp[0].getWidth() > placeholderImage.getWidth()) {
int diff = tmp[0].getWidth() - placeholderImage.getWidth();
int x = diff/2;
tmp[0] = tmp[0].subImage(x, 0, placeholderImage.getWidth(), placeholderImage.getHeight(), true);
} else if (tmp[0].getHeight() > placeholderImage.getHeight()) {
int diff = tmp[0].getHeight() - placeholderImage.getHeight();
int y = diff/2;
tmp[0] = tmp[0].subImage(0, y, Math.min(placeholderImage.getWidth(), tmp[0].getWidth()),
Math.min(placeholderImage.getHeight(), tmp[0].getHeight()), true);
}
});
} else {
tmp[0] = downloadedImage.scaledLargerRatio(placeholderImage.getWidth(), placeholderImage.getHeight());
if (tmp[0].getWidth() > placeholderImage.getWidth()) {
int diff = tmp[0].getWidth() - placeholderImage.getWidth();
int x = diff/2;
tmp[0] = tmp[0].subImage(x, 0, placeholderImage.getWidth(), placeholderImage.getHeight(), true);
} else if (tmp[0].getHeight() > placeholderImage.getHeight()) {
int diff = tmp[0].getHeight() - placeholderImage.getHeight();
int y = diff/2;
tmp[0] = tmp[0].subImage(0, y, Math.min(placeholderImage.getWidth(), tmp[0].getWidth()),
Math.min(placeholderImage.getHeight(), tmp[0].getHeight()), true);
}
}
EncodedImage[] image2Return = new EncodedImage[1];
if (!Display.getInstance().isEdt()) {
// The image scaling has to be called from EDT
Display.getInstance().callSeriallyAndWait(() -> {
Image roundMask = Image.createImage(tmp[0].getWidth(), tmp[0].getHeight(), 0xff000000);
Graphics gr = roundMask.getGraphics();
gr.setColor(0xffffff);
gr.fillArc(0, 0, tmp[0].getWidth(), tmp[0].getHeight(), 0, 360);
Object mask = roundMask.createMask();
tmp[0] = tmp[0].applyMask(mask);
image2Return[0] = EncodedImage.createFromImage(tmp[0], false);
});
} else {
Image roundMask = Image.createImage(tmp[0].getWidth(), tmp[0].getHeight(), 0xff000000);
Graphics gr = roundMask.getGraphics();
gr.setColor(0xffffff);
gr.fillArc(0, 0, tmp[0].getWidth(), tmp[0].getHeight(), 0, 360);
Object mask = roundMask.createMask();
tmp[0] = tmp[0].applyMask(mask);
image2Return[0] = EncodedImage.createFromImage(tmp[0], false);
}
return image2Return[0];
}
、NPEがオーバーライドURLImage.ImageAdapter
に由来すると思われる:
java.lang.IllegalArgumentExceptionが:0 でcom.codename1:作成した画像は、長さの所与 画像データに失敗しました.ui.Image.createImage(Image.java:654)at com.codename1.ui.EncodedImage.getInternal(EncodedImage.java:365)at com.codename1.ui.EncodedImage.getInternalImpl(EncodedImage.java:340) com.codename1.ui.EncodedImage.getHeight(EncodedImage.java:522)at com.codename1.ui.Image.scaledLa rgerRatio(Image.java:899)at com.my.application.ParametresGeneraux $ 1.lambda $ adaptImage $ 0(ParametresGeneraux.java:564) com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:95)at com.codename1.ui.Display.processSerialCalls(Display.java:1154)at com.codename1.ui.Display.edtLoopImpl(Display.java:1098)at com.codename1.ui.Display.invokeAndBlock(Display.java: 1207)at com.codename1.ui.Display.invokeAndBlock(Display.java:1244)at com.codename1.ui.URLImage $ DownloadCompleted.actionPerformed(URLImage.java:233) at com.codename1.ui.URLImage $ 4 .onSucess(URLImage.java:301)at com.codename1.ui.URLImage $ 4.onSucess(URLImage.java:297)at com.codename1.util.CallbackDispatcher.run(Cal lookDispatcher.java:53) com.codename1.ui.Display.processSerialCalls(Display.java:1154) com.codename1.ui.Display.edtLoopImpl(Display.java:1098) com.codename1.uiにあります。 Display.mainEDTLoop(Display.java:999)at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) [EDT] 0:0:0.1 - コードネームつのリビジョン: e5c43877074c18b4b5c7748d000e5cfac75ab749 2318
[EDT] 0:0:0,1 - 例外:java.lang.NullPointerExceptionが - com.codename1でヌル java.lang.NullPointerExceptionが.impl.javase.JavaSEPort.scale(JavaSEPort.java: 3996)at com.codename1.ui.Image.scale(Image。java:1007) com.codename1.ui.Image.scaledImpl(Image.java:953) com.codename1.ui.Image.scaled(Image.java:918) com.codename1.impl.javaseにあります。 JavaSEPort $ 71.save(JavaSEPort.java:7659)at com.codename1.ui.EncodedImage.scaledEncoded(EncodedImage.java:626)at com.codename1.ui.EncodedImage.scaled(EncodedImage.java:653)at com .codename1.ui.Image.scaledLargerRatio(Image.java:904)at com.my.application.ParametresGeneraux $ 1.lambda $ adaptImage $ 0(ParametresGeneraux.java:564) at com.codename1.ui.RunnableWrapper.run(RunnableWrapper .java:95)at com.codename1.ui.Display.processSerialCalls(Display.java:1154)at com.codename1.ui.Display.edtLoopImpl(Display.java:1098)at com.codename1.ui.Display.invokeAndBlock(Display.java:1207)at com.codename1.ui.Display.invokeAndBlock(Display.java:1244)at com.codename1.ui.URLImage $ DownloadCompleted.actionPerformed(URLImage .java:233) com.codename1.ui.URLImage $ 4.onSucess(URLImage.java:301) com.codename1.ui.URLImage $ 4.onSucess(URLImage.java:297) com.codename1.util .CallbackDispatcher.run(CallbackDispatcher.java:53) com.codename1.ui.Display.processSerialCalls(Display.java:1154)at com.codename1.ui.Display.edtLoopImpl(Display.java:1098)at com .codename1.ui.Display.mainEDTLoop(Display.java:999)at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) com.codename1.impl.Co denameOneThread.run(CodenameOneThread.java:176は)
また、.cn1ディレクトリ内一目ですべてがNPEなしで動作したときに表示されていないサフィックス「ImageURLTMP」とURLImageストレージファイル名を示しています。
最後に、このフォームに戻っても、すべて正常に動作します(画像はNPEなし)。私はimageAdapter
にdownloadedImage nullnessをテストしようとしましたが、EncodedImageはnullではありません。
このNPEを回避するにはどうすればよいですか?
編集2017年3月1日
@Diamondと@Shaiからの回答の後、私はInfiniteScrollAdapter行で画面を埋めるために望んでいる、その結果、同時に同じ画像のダウンロードを起動するためにNPEが発生したと考えています(キャッシュにないため)。だから、解決策はInfiniteScrollAdapterがループするのを防ぐことです(有限になります)。どうやってやるの ?
また、404エラーがないことに注意してください。ネットワークモニタには、以下のように応答コード200が表示されます。しかし、イメージは3回ダウンロードするべきではありませんか?お使いのアダプタのチェックで
ポストあなたのInfinteScrollerのために使用されるコードのスニペットをしてURLImage – Diamond
私はそれを忘れてしまいました!私の編集@Diamondを見てください! – HelloWorld