Несколько вещей не так с этим.Во-первых, вы никогда, НИКОГДА не трогаете какие-либо элементы пользовательского интерфейса из созданного вами потока.
Вам понадобится подписаться с обработчиками потоков: http://developer.android.com/reference/android/os/Handler.html
То, как они работают,Вы инициализируете их в своем обычном потоке пользовательского интерфейса.(поток, вызываемый вашим методом onCreate ().) Обработчики - это потокобезопасные объекты, которые вы расширяете для связи между потоками.
Итак, в вашем onCreate ():
Handler pHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Bundle bundle = msg.getData();
int msg_type = bundle.getInt("TYPE");
if (msg_type == MyThread.ERROR_MSG)
{
///SOMETHING HAPPENED
return;
}
else
{
//background task finished ok
}
}
};
Тогдаиз вашего метода run () вы отправляете ему сообщение, используя объект Bundle и Message.http://developer.android.com/reference/android/os/Bundle.html и http://developer.android.com/reference/android/os/Message.html
Чтобы сохранить чистоту, мне нравится расширять класс Thread, добавляя немного согласованности ...
class MyThead extends Thread
{
public final int ERROR_MSG = 0;
public final int OK_MSG = 1;
Handler mHandler;
MyThread(Handler pHandler)
{
mHandler = pHandler;
}
@Override
public void run()
{
//send a message back to the ui thread....
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putInt("TYPE", OK_MSG);
msg.setData(bundle);
mHandler.sendMessage(msg);
}
}
Это, если вы хотите получить немного фантазии, вы полностью разделяете код пользовательского интерфейса и код рабочего потока.Если ваша фоновая задача не займет много времени, вы можете использовать runonUiThread (), как описано выше.
Возможно, вы также захотите использовать AsyncTask, см. http://developer.android.com/reference/android/os/AsyncTask.html
Вот пример из ихстраница, его использование довольно просто:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
В конце концов, хотя, эти подходы не идеальны, если пользователь меняет ориентацию, когда ваша задача выполняется.(или если ваша деятельность прервана по какой-либо другой причине.) В этом случае вы захотите настроить службу: http://developer.android.com/reference/android/app/Service.html