2017-10-02 3 views
0

Aujourd'hui, en programmant mon application, je suis soudainement tombé sur un comportement étrange. Je créais un bouton de retour arrière pour mon application, mais le compilateur ne faisait que sauter un morceau de code. Voici la disposition de mon main.axml.Programme qui saute étrangement un morceau de code dans Xamarin Visual Studio 2017

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:minWidth="25px" 
android:minHeight="25px"> 
<EditText 
    android:text="123456123456123456" 
    android:id="@+id/input" 
    android:layout_width="match_parent" 
    android:layout_height="60dp" 
    android:gravity="center|left" 
    android:background="#ffffff" 
    android:textSize="20sp" 
    android:textColor="#000000" /> 
<TextView 
    android:text="Text" 
    android:id="@+id/result" 
    android:layout_width="match_parent" 
    android:layout_height="60dp" 
    android:gravity="center|left" 
    android:background="#555555" 
    android:textSize="20sp" 
    android:textColor="#ffffff" /> 
<Button 
    android:text="Backspace" 
    android:id="@+id/bksp" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:background="#555555" 
    android:textSize="20sp" 
    android:textColor="#ffffff" /> 
</LinearLayout> 

Et voici mon contenu de MainActivity.cs

using Android.App; 
using Android.Widget; 
using Android.OS; 
using Android.Views; 
using System.Timers; 

namespace App2 
{ 
[Activity(Label = "App2", MainLauncher = true, WindowSoftInputMode = SoftInput.StateAlwaysHidden)] 
public class MainActivity : Activity 
{ 
    private bool Bksp_isdown = false; 
    private int intt = 0; 
    private Timer Bksp_tmr; 
    private Button Bksp; 
    private EditText Inputt; 
    private TextView Resultt; 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.Main); 
     this.Bksp_tmr = new Timer(500); 
     this.Bksp = this.FindViewById<Button>(Resource.Id.bksp); 
     this.Inputt = this.FindViewById<EditText>(Resource.Id.input); 
     this.Resultt = this.FindViewById<TextView>(Resource.Id.result); 
     this.Inputt.ShowSoftInputOnFocus = false; 
     this.Bksp.Touch += this.B_backspace_Touch; 
     this.Bksp_tmr.Elapsed += this.Bksp_tmr_Elapsed; 
    } 

    private void Bksp_tmr_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     this.Resultt.Text = "worked" 
         + this.Bksp_isdown.ToString() + this.Inputt.SelectionStart.ToString(); 
     while (true) 
     { 
      this.intt = this.intt + 100; 
      this.Backspace(); 
     } 
    } 

    private void B_backspace_Touch(object sender, View.TouchEventArgs e) 
    { 
     this.Bksp_isdown = true; 
     if (e.Event.Action == MotionEventActions.Down) 
     { 
      this.Backspace(); 
      this.Bksp_tmr.Start(); 
     } 
     else if (e.Event.Action == MotionEventActions.Up) 
     { 
      this.Bksp_tmr.Stop(); 
      this.Bksp_isdown = false; 
     } 
    } 
    private bool Backspace() 
    { 
     intt++; 
     this.Bksp.Text = intt.ToString(); 
     if (this.Inputt.SelectionStart == 0) 
      return false; 

     string str = this.Inputt.Text; 
     int sel = this.Inputt.SelectionStart; 
     str = str.Substring(0, sel - 1) + str.Substring(sel); 
     this.Inputt.Text = str; 
     this.Inputt.SetSelection(sel - 1); 
     return true; 
    } 
} 
} 

Quand je lance et ce déployé code dans un appareil Android 6, j'ai vu un comportement étrange. Il y a une méthode au-dessus de nommée Bksp_tmr_Elapsed qui fonctionnait partiellement dans le programme que le while (true) et le code à l'intérieur étaient complètement ignorés. Je n'ai pas vu un tel comportement dans toute ma vie. Vous pouvez demander pourquoi j'ai donné une expression booléenne constante dans while loop. C'était seulement parce que le code ne fonctionnait pas normalement car je peux m'attendre à une chute infinie de l'application, mais malheureusement pas. S'il vous plaît aider !!

Mise à jour: J'ai vérifié le code et obtenu une note que seule la première ligne à l'intérieur de la méthode Bksp_tmr_Elapsed exécuté dans l'application. J'ai apporté quelques modifications au code dont je fournis la capture d'écran.

Check here the first two lines in the method Bksp_tmr_Elapsed.

Check here the updated code.

Maintenant, nous pouvons faire une conclusion que de toute évidence l'application dans le dispositif est mis à jour un et l'ignorant simplement toutes les autres lignes de la méthode. Cela ressemble à une déclaration de retour cachée que le compilateur ajoute à la deuxième ligne de la méthode que je ne connais pas ou que je ne connais pas. S'il vous plaît expliquer cela !!!

Répondre

0

== == Modifier

i ajouté une prise d'essai à votre tranquillité d'un code comme on le voit ci-dessous et a trouvé le problème

private void Bksp_tmr_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 

      this.Resultt.Text = "worked" 
          + this.Bksp_isdown.ToString() + this.Inputt.SelectionStart.ToString(); 
      while (true) 
      { 
       this.intt = this.intt + 100; 
       this.Backspace(); 
      } 
     } 
     catch(Exception ex) 
     { 
      Toast.MakeText(this, ex.Message, ToastLength.Long); 
     } 
    } 

l'erreur je suis arrivé était la suivante

{Android.Util.AndroidRuntimeException: seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues. à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

Pour en savoir plus sur cette erreur plus un coup d'oeil Here

Pour résoudre ce problème procédez comme suit (ajouter le filetage à votre projet)

RunOnUiThread(() => 
      { 

       this.Resultt.Text = "worked" 
           + this.Bksp_isdown.ToString() + this.Inputt.SelectionStart.ToString(); 
       while (true) 
       { 
        this.intt = this.intt + 100; 
        this.Backspace(); 
       } 
      }); 

Vous pouvez lire sur RunOnUiThread Here

+0

Merci pour la réponse, mais non, le problème n'a pas été faux déploiement. J'ai mis à jour la question. –

+0

Je regarde si je peux reproduire ce mal être de retour momentanément –

+0

J'ai trouvé le problème ne peut pas croire que je n'ai pas pensé à cela plus tôt j'ai ajouté un essai sur votre code et trouvé cette erreur {Android. Util.AndroidRuntimeException: seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues. –