2016-12-29 10 views
0

コードのプログラミングを簡略化してプロジェクトを再設計しました。私はxmlレイアウトを通して静的なすべての画像を配置しました。レイアウトが常に読み込まれるとは限りません

私はプログラムを実行すると2つの結果しか得られません。私は問題

Connected to process 10651 on device 4.7_WXGA_API_22 [emulator-5554] 
I/art: Not late-enabling -Xcheck:jni (already on) 
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 

信じる:問題なく

enter image description here

2)問題

enter image description here

私は次のエラーを取得して実行すると実行している

1)うそをつく私はこの内面階級にいますか?

private class MatchCardGame{ 

    private Game mMatchGame; 

    private List<Drawable> revealImagesOfCards; 
    private List<Integer> revealCards; 
    private Drawable hiddenCard; 
    private List<Integer> cardPoints; 
    private List< Boolean> isHidden; 

    public MatchCardGame(int numOfCards){ 

     mMatchGame = new Game(numOfCards); 
     revealImagesOfCards = new ArrayList<>(); 
     revealCards = new ArrayList<>(); 
     cardPoints = new ArrayList<>(); 
     isHidden = new ArrayList<>(); 

     setCoverCard(); 

     for(int i = 1; i <= numOfCards; i++) 
      setMatchImageCard(i); 

    } 
    public void setMatchImageCard(int cardLoc){ 

     int drawableLoc = mMatchGame.findImageOfCard(cardLoc); 
     Drawable drawable = ResourcesCompat.getDrawable(getResources(), drawableLoc, null); 
     Integer revealCard = mMatchGame.findContentsOfCard(cardLoc); 

     revealImagesOfCards.add(drawable); 
     revealCards.add(revealCard); 
     cardPoints.add(Integer.valueOf(20)); 
     Boolean hideCard = true; 
     isHidden.add(hideCard); 

    } 
    private void setCoverCard(){ 
     hiddenCard = ResourcesCompat.getDrawable(getResources(), R.drawable.black_card, null); 
    } 

    public Drawable getImage(int loc, boolean statReveal){ 
     loc--; 
     if(!statReveal){ 
      Boolean hideCard = isHidden.get(loc); 
      hideCard = true; 
      return hiddenCard; 
     } 
     else { 
      Boolean hideCard = isHidden.get(loc); 
      hideCard = false; 
      return revealImagesOfCards.get(loc); 
     } 



    } 

    public boolean getHiddenStat(int loc){ 
     loc--; 
     Boolean hideCard = isHidden.get(loc); 
     return hideCard; 
    } 

    public boolean compareCards(int loc1, int loc2){ 
     loc1--; 
     loc2--; 

     Integer card1 = revealCards.get(loc1); 
     Integer card2 = revealCards.get(loc2); 
     Integer cardPts1 = cardPoints.get(loc1); 
     Integer cardPts2 = cardPoints.get(loc2); 


     if(card1 == card2){ 

      int num = Integer.valueOf(scoreText.getText().toString()); 

      Log.i("TAGG","Score Points: " + (cardPts1 + cardPts2)); 
      new AdjustScore().execute(Integer.valueOf(cardPts1 + cardPts2)); 


      return true; 
     } 

     else{ 


      cardPts1 -= 5; 
      cardPts2 -= 5; 


      if(cardPts1 < 0) 
       cardPts1 = 0; 

      if(cardPts2 < 0) 
       cardPts2 = 0; 

      cardPoints.set(loc1, cardPts1); 
      cardPoints.set(loc2,cardPts2); 

      return false; 
     } 


    } 

    private class AdjustScore extends AsyncTask<Integer,Integer,Void>{ 

     private TextView scoreText; 
     private int currentScore; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      scoreText = (TextView) findViewById(R.id.score_txt); 
      currentScore = Integer.valueOf(scoreText.getText().toString()); 
     } 

     @Override 
     protected Void doInBackground(Integer... integers) { 
      final int num = integers[0]; 

      Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 

      for (int x = 1; x <= num; x++){ 


         try { 
          Thread.sleep(20); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 

         publishProgress(Integer.valueOf(currentScore + x)); 
        } 


      } 
     }; 
     new Thread(runnable).start(); 

     return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      Message msg = scoreHandler.obtainMessage(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("myPoints",String.valueOf(values[0])); 



      msg.setData(bundle); 
      scoreHandler.sendMessage(msg); 

     } 
    } 


} 

私はAsynTaskから派生別の内部クラスを持って活動

private MatchCardGame myGame; 
private List<Integer> selectCards; 
private TextView scoreText; 

private Handler scoreHandler = new Handler(){ 

    @Override 
    public void handleMessage(Message msg) { 

     Bundle bundle = msg.getData(); 
     String stat1 = bundle.getString("myPoints"); 

     int num = Integer.valueOf(stat1); 


     scoreText.setText(String.valueOf(num)); 


    } 


}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_card_game); 

    myGame = new MatchCardGame(12); 
} 

ののonCreateでこれを呼び出します。 これは、主にカードビューを設定し、画像ビューでクリックリスナーを設定するために使用されます。しかし、私はそれが問題だとは思わない。

+0

イメージを効率的に読み込むグライドライブラリを試すことができます。 [This](http://www.androidhive.info/2016/04/android-glide-image-library-building-image-gallery-app/)助けてくれるかもしれない –

+0

画像のデコードにかかる時間をプロファイルする必要があります。コードがどのように機能しているかをよりよく理解するために、あなたの側からパフォーマンス評価を行います。また、ログを使用して、アプリケーションが別々の非同期タスクで行っていることを調べることも検討してください。また、ほとんどのゲームでは、コンテンツの読み込み中にスプラッシュ画面が表示され、コンテンツが利用可能であることを確認できます。しかしながら;あなたの側から最適化し、アプリケーションの動作を理解しようとする必要があります。 – JoxTraex

+0

@ AkshayBhat'AB 'これは、Glideや他の画像ライブラリでは修正できません。彼は地元のイメージを持ち、常に競争条件の可能性があるタスクにそれらをロードしています。好奇心から外へ –

答えて

2

まず、エラーではありません。彼らはガベージコレクタです。これは完全に正常です。同時にパフォーマンス上の問題がなければ、懸念すべきではありません。それらを避けるためにxmlではなくコードで何かを行うことは不要であり、ガベージコレクタが必要なときにはうまくいきません。

第2に、すべての画像をAsyncTaskにロードしています。ときどきうまくいくことがあります(イメージを読み込むためにメインスレッドを一時停止するのを止めます)。しかし、デフォルトのイメージがないと、そのタスクが完了するまで実際にイメージを表示することはできません。したがって、図面とタスクの仕上げの間に競合条件があります。

解決策:xmlで行うか、読み込み画面を表示してください。私は最初にお勧めします。なぜなら、画像がアプリからの静的な画像であれば、アプリが起動したときにロードされたものであれば、あなたのタスクは実際には何も役立たないからです。

+0

、ローディング画面とはどのように私はそれを置くのですか?それはxml、onCreate()、コンストラクタ、または他のオーバーライドされたメソッドを介して行われます。 –

+0

読み込み画面はスプラッシュアクティビティとしてよく知られています。基本的には多くのアプリケーションで見られるようなイントロ画面ですが、主にフルスクリーンでアプリケーション名で構成され、コンテンツが読み込まれ、最初にほとんどのタスクが実行されるため、ユーザーはデータを待つ必要がありません空の画面にロードする。 – Ricardo

関連する問題