Я заметил разницу в раскладках разговора при работе с пользовательскими представлениями в Android. У меня есть два пользовательских представления, полученных из FrameLayout внутри LinearLayout. Первый FrameLayout добавляется в поток без UI, используя метод RunOnUiThread(). Второй FrameLayout добавляется с помощью UIThread.Зачем пропускать пропуск при добавлении пользовательского представления в поток?
Теперь разница, которую я замечаю, заключается в том, что метка обращения к FrameLayout, которая добавляется напрямую с использованием UIThread, равна 2. В то время как мера попадает для FrameLayout, которая добавляется из не-UIThread с использованием RunOnUiThread(), равна 1. Обычно в Android, метка показов для пользовательского представления равна 2. Но Почему пропускается второй шаг при добавлении представления с помощью параметра RunOnUiThread()?
Кто-нибудь знает причину этого различия в макете проходит при использовании потоков в Xamarin.Android? Я приложил мой MainActivity код для справки:
MainActivity.cs
public class MainActivity : Activity
{
int count = 1;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
var view = FindViewById<LinearLayout>(Resource.Id.Linear);
Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(500);
RunOnUiThread(() =>
{
var threadView = new CustomViewInsideThread(this);
view.AddView(threadView);
});
});
var nonThreadView = new CustomViewOusideThread(this);
view.AddView(nonThreadView);
}
}
public class CustomViewInsideThread : FrameLayout
{
public CustomViewInsideThread(Context context)
: base(context)
{
}
int hitCount = 0;
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
hitCount++;
Console.WriteLine("Measure hit " + hitCount.ToString() + "time");
}
}
public class CustomViewOusideThread : FrameLayout
{
public CustomViewOusideThread(Context context)
: base(context)
{
}
int hitCount = 0;
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
hitCount++;
Console.WriteLine("Measure hit " + hitCount.ToString() + "time");
}
}
Main.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:id="@+id/Linear"
android:layout_height="fill_parent" />
Может быть, не имеет отношения к вашему вопросу , но заметили ли вы, что вы вызываете 'SetContentView (Resource.Layout.Main);' дважды !? И: не могли бы вы добавить свой Main.axml? –
Hi @ Sven-MichaelStübe, Извините, это по ошибке, я добавил, что он дважды не имеет последствий для этой проблемы. Я добавил код Main.axml. – Harikrishnan