2011-05-16 67 views
0

我一直在讀我的java書中的線程,我想嘗試使用兩個連續的線程同時進行更新。使用線程更新兩個連續的文本瀏覽器

當然,雖然線程無法更新用戶界面。我已經使用了一些處理程序,但只是通過從一個類傳遞信息到另一個類來捕獲服務到活動的位置。

但這一定比這更簡單。

我假設我應該使用AsyncTask,但我想在每個字段中計數1-10,並且我不想繼續浸入和退出asynctask類。

任何指針讚賞

斯蒂芬

UPDATE

所以我做了一點嘗試多。我編寫了一個處理程序方法來處理髮送給它的任何消息。它檢查它應該更新的字段,然後在所述字段上執行setText。下面是代碼

Handler myHandler = new Handler(){ 
public void handleMessage(Message msg){ 
msg = Message.obtain(); 
Bundle bundle = msg.getData(); 

String fieldName = bundle.getString("fieldName"); 
int count = bundle.getInt("count"); 

if(fieldName=="text1"){ 
    text1.setText(count); 
}else{ 
    text2.setText(count); 
} 
} 
}; 

然後我在活動的onCreate這將啓動兩個線程一些代碼,每個線程通過與我詮釋計數到處理程序的消息。它還傳入一個TextView名稱,以便我的處理程序知道應該更新哪個文本視圖。下面是代碼...

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

text1 = (TextView)findViewById(R.id.text1); 
text2 = (TextView)findViewById(R.id.text2); 

new Thread(){ 
    public void run(){ 
    for(int i=1;i<10;i++){ 
    message = Message.obtain(myHandler); 
    Bundle bundle = new Bundle(); 
    bundle.putCharSequence("fieldName", "text1"); 
    message.setData(bundle); 
    myHandler.sendMessageDelayed(message, 1000); 
    } 
     } 
    }.start(); 

new Thread(){ 
    public void run(){ 
    for(int i=1;i<10;i++){ 
    message = Message.obtain(myHandler); 
    Bundle bundle = new Bundle(); 
    bundle.putCharSequence("fieldName", "text2"); 
    message.setData(bundle); 
    myHandler.sendMessageDelayed(message, 1000); 
    } 
} 
    }.start();  

} 

但我使用setText

05-17 17得到一個錯誤:13:00.013:ERROR/AndroidRuntime(966):android.content.res.Resources $ NotFoundException:字符串資源ID#0x0

任何想法?

+0

「我認爲我應該使用AsyncTask,但是我想在每個字段中計數1-10,並且我不想繼續在asynctask類中進出。」 - 那是什麼意思? – CommonsWare 2011-05-16 19:39:36

回答

1

以下是您可以做的事情。你在使用AsyncTask的正確軌道上,所以擴展這個類並把你的計數放在進度更新函數中。你應該有這樣的事情:

private class BackgroundTask extends AsyncTask<Void, Void, Void> { 
    int i; 

    protected void onPreExecute() { 
     i = 0; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     i++; 
     publishProgress(i); 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     TextView tv1 = (TextView) Main.this.findViewById(R.id.textView1) 
     TextView tv2 = (TextView) Main.this.findViewById(R.id.textView2) 
     tv1.setText(i); 
     tv2.setText(i); 
    } 

    protected void onPostExecute(Void result) { 
     i = null; 
    } 
} 

其中Main是你的活動和textView1textView2是你要更新您的文本視圖。

+0

謝謝你們,我會嘗試這兩種方法,我會讓你知道我是如何得到的 – Stephen 2011-05-17 08:53:40

+0

我偶然回答了我自己的問題。請在這篇文章中看到額外的答案。 – Stephen 2011-05-18 12:01:56

1

如果你真的想運行兩個額外的線程,可以用處理程序完成。只需爲您的活動創建一個處理程序並切換。然後啓動兩個線程,並在每個線程完成時使用適當的值向消息處理程序發送消息。然後在處理程序的UI線程中更新處理程序中相應的文本視圖:

private Handler myHandler= new Handler(){ 
    @Override 
    public void handleMessage(Message msg){   
     switch(msg.what){ 
      case 0: 
       this.removeMessages(0); 
       Toast.makeText(Main.this,"Message0", Toast.LENGTH_SHORT).show(); 
      break; 
      case 1: 
       this.removeMessages(1); 
       Toast.makeText(Main.this,"Message1", Toast.LENGTH_SHORT).show(); 
       break; 
      default: 
       super.handleMessage(msg); 
       break; 
     } 
    } 
}; 

只需用您的UI更新代碼替換烤麪包即可。您可以啓動一個線程,如:

// DISPLAY ON CLICK HANDLER 
    threadButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      Thread thread= new Thread(new Runnable() { 
       public void run() { 
        try { // DO NOT TOUCH THE UI HERE 
        Thread.sleep(1000); // mimic time consuming task 
        } 
        catch(Exception e){ 
        } 
        myHandler.sendEmptyMessage(0); 
       } 
      }); 
      thread.setDaemon(true); 
      thread.start(); 
     } 
    }); 

如果你只是想數從i = 1-10秒,你甚至不需要使用線程,只需使用postMessageDelayed通過循環,並呼籲:

myHandler.sendEmptyMessageDelayed(0, 1000); // what 0, 1 second 

可以傳遞(優選不可變的)在消息中的數據如下所示:

Message msg= Message.obtainMessage(0); 
Bundle b= new Bundle(); 
b.putString("stringData",outString); 
msg.setData(b); 
handler.sendMessage(msg); 

並檢索它如下所示:

Bundle b= msg.getData(); 
String data=""; 
if (b != null){ 
    data= b.getString("stringData"); 
} 

如果你只需要一個額外的線程,我會使用asyncTask。