2016-01-07 2 views
1

Моя анимация просмотра изображений пропускает кадры, хотя я использую runOnUiThread. Кто-нибудь знает, что я делаю неправильно? Вот мой код Java:33/31/32 кадры пропущены, хотя я использую runOnUiThread

import android.app.Activity; 
import android.os.*; 
import android.view.animation.LinearInterpolator; 
import android.view.animation.TranslateAnimation; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 

ImageView a; 
TranslateAnimation pengesat; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    a = (ImageView) findViewById(R.id.imageView3); 
    pengesat = new TranslateAnimation(0.0f, 300.0f, 0.0f, 0.0f); 
    pengesat.setDuration(5000); 
    pengesat.setRepeatCount(2); 
    pengesat.setInterpolator(new LinearInterpolator()); 
    new Thread(new Runnable(){ 
     @Override 
     public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         a.startAnimation(pengesat); 
        } 
       }); 
     } 
    }).start(); 
    } 
    } 

И вот мой xml-код. Я использую только четыре изображения, возможно, размеры изображений слишком велики? Я видел много учебников, и я думаю, что я правильно использую потоки, но почему кадры пропускают, и почему он говорит, что основной поток может делать слишком много работы?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@string/layout" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.ennio.lojaprove.MainActivity"> 

<ImageView 
    android:id="@+id/img" 
    android:src="@drawable/bg" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:scaleType="centerCrop" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView" 
    android:src="@drawable/border" 
    android:scaleType="centerCrop" 
    android:layout_alignTop="@+id/img" 
    android:layout_centerHorizontal="true" /> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView2" 
    android:src="@drawable/border" 
    android:scaleType="centerCrop" 
    android:layout_alignBottom="@+id/img" 
    android:layout_centerHorizontal="true" /> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView3" 
    android:src="@drawable/pengesa" 
    android:layout_above="@+id/imageView2" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

</RelativeLayout> 
+0

Я всегда ненавижу говорить (особенно когда я только что давал ответ), но когда у вас есть вопрос о stackoverflow, который в итоге получил правильный ответ, вы должны отметить его как принято. Выдвижение и маркировка как принятые - две разные вещи. Если кто-нибудь должен был увидеть предыдущий ваш вопрос, который имеет несколько разных ответов, которые человек может не знать, что оказалось правильным и помогло вам. Кроме того, это позволяет различным пользователям, предоставляющим ответы, знать, могли ли они дать вам правильное направление. – d0nut

+0

Я не говорю об этом конкретно, но в истории вопроса вы не отметили ни одного ответа, как принято. Вы должны вернуться и сделать это :) – d0nut

+0

Прошу прощения, но я новичок в stackoverflow, и я не знаю, как правильно его использовать. но я буду помнить это :) – Eae

ответ

4

Если вы пропускаете кадры, это, вероятно, потому, что основной поток выполняет слишком много работы. Другая возможность заключается в том, что вы каким-то образом блокируете основной поток (ожидание асинхронного вызова, сна и т. Д.). В этом случае, однако, из вашего кода я подозреваю, что это потому, что он слишком много работает.

Большая проблема, я вижу, однако, в том, что вы не должны создавать нить здесь.

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        a.startAnimation(pengesat); 
       } 
      }); 
    } 
}).start(); 

Что это значит, это создать отдельный поток, который живет очень кратко. Все, что он делает за это короткое время, - это добавить исполняемый файл, который будет выполняться в основном потоке.

Вы должны заменить приведенный выше код следующим:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     a.startAnimation(pengesat); 
    } 
}); 

В случае, видя пропущенных кадров на андроид эмулятор, вы, вероятно, не придется беспокоиться, если число не превышает 60 или около того. Эмулятор Android очень медленный, и я не удивлюсь, если увижу пропущенные кадры, особенно при анимации. Вы можете смело игнорировать это сообщение (в данном случае).


Возможно, если вы все еще получаете это сообщение на реальном устройстве, это может быть потенциальным решением:

a = (ImageView) findViewById(R.id.imageView3); 
pengesat = new TranslateAnimation(0.0f, 300.0f, 0.0f, 0.0f); 
pengesat.setDuration(5000); 
pengesat.setRepeatCount(2); 
pengesat.setInterpolator(new LinearInterpolator()); 
a.setAnimation(pengesat); //<-- this line here is new 

Я где-то читал, что на андроид 4.2.2 вы должны установите анимацию, используемую на вид до, вызывающий startAnimation. Я никогда не пробовал это сам, но мог бы распространяться на 5.0+ android

+0

Я заменил, но все равно получаю одно и то же сообщение «Пропущенные xx-фреймы! Приложение может делать слишком много работы на его основной теме ",:/ – Eae

+0

@ Eani заменить не было, чтобы исправить эту пропущенную проблему с xx кадрами. Это был общий код, который я просто указывал. Это на реальном телефоне или эмуляторе? – d0nut

+0

О, хорошо, это на эмуляторе, может быть, из-за этого? – Eae

Смежные вопросы