2012-07-02 20 views
0

閱讀了很多片段和教程後,我仍然(或甚至更多)對要走的道路感到困惑。我需要一個線程/ backgroundtask,它偵聽套接字上的傳入事件並向UIThread報告任何接收事件。什麼是首選的方式?自己的線程或多任務?將數據傳輸到主線程的最佳方法是什麼?如何在Android中收聽傳入的事件UIThread

感謝您對此事的任何想法。

問候, 馬庫斯

以下考慮您的回答,我已經試過如下:

MainActivity:

public class MainActivity extends Activity { 


Handler handler = new Handler() { 

    @Override 
     public void handleMessage(Message msg) { 
      toastSomething(); 
     }; 
}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    threadstarter(); 
} 


protected void threadstarter() { 

    super.onStart(); 

    Thread backgroundthread = new Thread(new WorkerThread(handler)); 
    backgroundthread.start(); 
} 

public void toastSomething() { 
    Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show(); 
} } 

的我可運行:

public class WorkerThread implements Runnable { 

Handler messageHandler; 

WorkerThread(Handler incomingHandler) { 
    messageHandler = incomingHandler; 
} 

public void run() { 

    while (true) { 

     for (int i = 0; i <= 100000; i++) { 
      // wait a moment 
     } 
     messageHandler.sendEmptyMessage(1); 
    } 
} } 

我的佈局只保留一個額外的複選框:

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 

<CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="CheckBox" /> 

的好處是,將出現敬酒。糟糕的是,cehckbox沒有響應,應用程序崩潰很快。那不是,應該怎麼做?

編輯:WorkerThread中的sendMessage中的msg似乎是異常情況下的麻煩製造者,該消息全部讀取使用?

+0

+1 @ paradx的答案。並且在SDK文件夾中有一些帶有服務的樣本,您可以嘗試它們。 – 2012-07-02 11:33:35

+0

您的複選框沒有響應,因爲'messageHandler.sendEmptyMessage(1)'一直運行,並且阻塞了UI線程。嘗試用'Thread.sleep(5000)'代替'for'循環,就是這樣。 –

回答

0

下面的代碼,這是最後的工作:

UIThread:

public class MainActivity extends Activity { 

    public static final String LOG_TAG = "UIThread"; 

    Handler handler = new Handler() { 

     @Override 
      public void handleMessage(Message msg) { 
       toastSomething(); 
       //Log.v(LOG_TAG, "main thread"); 
      }; 
    }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     threadstarter(); 
    } 

    protected void threadstarter() { 

     super.onStart(); 

     Thread backgroundthread = new Thread(new WorkerThread(handler)); 
     backgroundthread.start(); 
    } 

    public void toastSomething() { 
     Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show(); 
    } 
} 

的WorkerThread:

public class MainActivity extends Activity { 

    public static final String LOG_TAG = "UIThread"; 

    Handler handler = new Handler() { 

     @Override 
      public void handleMessage(Message msg) { 
       toastSomething(); 
       //Log.v(LOG_TAG, "main thread"); 
      }; 
    }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     threadstarter(); 
    } 

    protected void threadstarter() { 

     super.onStart(); 

     Thread backgroundthread = new Thread(new WorkerThread(handler)); 
     backgroundthread.start(); 
    } 

    public void toastSomething() { 
     Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show(); 
    } 
} 

HTH人。感謝所有的輸入。

0

僅從背景UIThread到communiacte方式是

runOnUIThread(new Runnable {.// your ui stuff goes here.}); 

handler.post(new Runnable{.// your ui stuff goes here.}); 

我想不出別的..這2在所有情況下都非常方便。在RU

+0

因此,如果新的runnable將是一個單獨的類,那麼實現可運行接口和我的處理程序是在發佈可運行子程序的uithread中創建的,那麼runnable如何將消息發佈到處理程序? –

0

你可以像這樣從後臺線程溝通到UIThread

Runnable runnable = new Runnable() 
{ 
@Override 
public void run() { 
    for (int i = 0; i <= 10; i++) { 
     handler.post(new Runnable() { 
      @Override 
       public void run() { 
        progress.setProgress(value); 
       } 
      }); 
     } 
    } 
}; 
0

你可以eithe r使用AsyncTask類,並在onPreExecute(...)onPostExecute(...)onProgressUpdate(...)方法內的UI線程中發佈。

另一種方法是爲後臺工作使用新線程,並將Runnable發佈到Handler

如果您在UI線程上實例化Handler,則發佈到處理程序的所有內容都將在UI線程上運行。如果您在後臺線程上實例化處理程序,那麼您發佈到處理程序的所有內容都將在後臺線程上運行。

+0

sry,但我仍然掛着。我想去一個單獨的課程,擴展可運行。在主要活動中,我會去尋找一個新的myrunnable,並實例化一個新的線程並給它一個myrunnable。在這種情況下,處理程序如何工作,我仍然不明白。 –

+0

你應該把你的Runnable作爲一個匿名的內部類來編寫,或者作爲你內部的類來編寫,否則你將無法訪問UI線程。或者,您可以將Handler作爲Runnable的構造函數中的參數,並在您的mainAtivity中創建Handler,並在實例化時將其傳遞給Runnable。 –