私はstackoverflowとそれに類するすべての回答を行ってきましたが、使用していないことが判明しました。Androidスレッドで画像を変更する
誰もこの機能が動作していない理由を指摘できますか?それは簡単でなければなりません:イメージを6秒ごとに更新します(3分ごとにテストされますが、6秒とします)。
コードが行うことは、4つの画像のそれぞれを段階的に通過しますが、画像は変更されません。しかし、最後の画像になると、それは変わります(??)。
質問:
- これで何が悪いのでしょうか?
- なぜ最後の画像のみを更新するのですか?
- "postDelayed"ではなく、ハンドラーの "post"だけでコードを開始すると、タブレットは黒い画面のままです。なぜ私はそれを動作させるために遅れてコードを開始する必要がありますか?
int currentIndex = 0;
boolean start = false;
ImageView descriptionImage;
private Runnable timerRunnable;
long startTime = 0;
private Handler handler;
int[] pictureIds = new int[]{R.drawable.hang, R.drawable.dog, R.drawable.coffee, R.drawable.about};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pictureDescription = new ArrayList<String>();
handler = new Handler(Looper.getMainLooper());
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_picture_test, container, false);
descriptionImage = (ImageView) v.findViewById(R.id.iv_picture);
return v;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
start();
}
private void start() {
start = true;
startTime = System.currentTimeMillis();
loadImage();
timerRunnable = new Runnable() {
@Override
public void run() {
while (start) {
long time = System.currentTimeMillis() - startTime;
float mins = (float) time/(60 * 1000);
if (mins >= 0.1f) {
startTime = System.currentTimeMillis();
if (currentIndex < pictureIds.length) {
currentIndex++;
loadImage();
}
}
}
}
};
handler.postDelayed(timerRunnable, 1000);
}
private void loadImage() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (currentIndex < pictureIds.length) {
descriptionImage.setImageResource(pictureIds[currentIndex]);
} else {
start = false; // finish
}
}
});
}
ありがとう!
EDIT:ハンドラの代わりにimageviewスレッドに投稿しても機能しません。
descriptionImage.postDelayed(timerRunnable、1000);
このコードでは、while(start)ループでUIスレッドをハングアップしませんか? –
これらの2つの回答に加えて、あなたのフラグメントの 'onPause'でHandler#removeCallbackを呼び出すことを忘れないでください。 –
そして、' runOnUiThread(action) 'は' uiHandler 'と同等です。投稿(アクション); '。あなたは既にUIハンドラを持っているので、なぜ 'getActivity()。runOnUiThread()'? –