Есть два способа сделать это.
Первый в XML-коде. Вам нужно обратить внимание на Gravity
Атрибут. Вы также можете найти этот атрибут в графическом редакторе; это может быть проще, чем редактор XML.
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:text="Your Text"
/>
Для вашего конкретного сценария значения гравитации будут:
center_vertical|center_horizontal
В графическом редакторе вы найдете все возможные значения, даже увидите их результаты.
То, что вы описываете, не является определенным поведением BackgroundWorker. Я подозреваю, что вы делаете что-то не так.
Вот небольшой пример, который доказывает, что BackgroundWorker использует исключения в DoWork и делает их доступными вам в RunWorkerCompleted :
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
if(e.Error != null)
{
MessageBox.Show("There was an error! " + e.Error.ToString());
}
};
worker.RunWorkerAsync();
My Навыки психической отладки раскрывают мне вашу проблему: вы обращаетесь к e.Result в обработчике RunWorkerCompleted - если есть e.Error, вы должны обработать ее, не обращаясь к e.Result. Например, следующий код плохой, плохой, плохой и вызовет исключение во время выполнения:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
// OH NOOOOOOOES! Runtime exception, you can't access e.Result if there's an
// error. You can check for errors using e.Error.
var result = e.Result;
};
worker.RunWorkerAsync();
Вот правильная реализация обработчика событий RunWorkerCompleted:
private void RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
DoSomethingWith(e.Result); // Access e.Result only if no error occurred.
}
}
VOILA, вы не получите исключения времени выполнения.
[Править]
Иуда имеет большое значение. В моем примере были указаны особенности обработки ошибки, но мой код фактически вызвал бы другое исключение, если бы исключение никогда не попадало в метод DoWork. Этот пример подходит, потому что мы специально показываем возможности обработки ошибок BackgroundWorker. Однако, если вы не проверяете параметр ошибки на null, это может быть вашей проблемой.
[/ Edit]
Я не вижу таких же результатов. Вы можете разместить небольшой код? Вот мой код.
private void Form1_Load(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Will cause another exception if an exception didn't occur.
// We should be checking to see if e.Error is not "null".
textBox1.Text = "Error? " + e.Error;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
if (i < 5)
{
Thread.Sleep(100);
}
else
{
throw new Exception("BOOM");
}
}
}
Вывод программы:
Ошибка? System.Exception: БУМ в BackgroundException.Form1.worker_DoWork (Объект отправитель, DoWorkEventArgs e) в D: \ Workspaces \ Sandbox \ BackgroundException \ BackgroundException \ Form1.cs: строка 43 в System.ComponentModel.BackgroundWorker.OnDoWork (DoWorkEventArgs есть System.ComponentModel.BackgroundWorker.WorkerThreadStart (Объект аргумент)
Интересная статья, похожая на ваш вопрос. В нем есть раздел по обработке исключений.