2012-12-20 55 views
-1

我想創建一個簡單的線程,從一個按鈕開始,但出了問題。 下面是代碼:與Java線程的Android

b1.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
      SendInfo si = new SendInfo(); 
      si.start(); 
      error.setText(si.getError()); 

     } 
    }); 

這裏是線程代碼:

package com.example.android.location; 

public class SendInfo extends Thread 
{ 
    private String error; 

    public void run() 
    { 
     this.error = "working"; 
    } 
    public String getError(){ 
     return this.error; 
    } 
} 

出於某種原因,第一個代碼塊中的錯誤實例保持爲空。

+1

我建議你使用['AsyncTask'](http://developer.android.com/reference/android/os/AsyncTask.html)。使用'AsynCtask',您可以在線程完成時執行UI操作。 – nkr

+0

你可以跟我們分享堆棧跟蹤嗎? –

+0

當我做了我的第一個Android應用程序時,我使用了java線程,因爲它很熟悉。但後來我決定學習AsyncTask,讓我告訴你它更容易。給它一個鏡頭,它不近,因爲某種原因,它看起來第一個看起來 –

回答

2

你有一場比賽。

start()電話後兩種:

1)你的代碼繼續和getError返回null,在此之後,線程運行。

2)的線程運行,並完成和getError將返回 「工作」。

在你的情況1)正在發生。

更新:實際上在選項2期間的理論中,您可能無法獲得「工作」作爲返回值。這是由於內存/線程可見性。同步對錯誤變量的訪問,或者在這種情況下只聲明該字段的volatile修正(但不是你最初的問題)。

1

有沒有保證線程此行

si.start();

之後開始,所以你不能只是得到error的希望,預期它的設置。你的線程沒有按照它的外觀。

此外,在方法上同步以防止指令的令人討厭的重新排序是明智的。

作爲一個整體解決此問題的一個辦法是在主線程上創建handler,並在線程完成執行後向其發送消息。

1

您最好使用ASyncTask而不是Thread。