2012-09-02 25 views
2

我是新手android程序員。剛開始看到一些在線教程時,我決定爲自己做一個應用程序..它一直工作得很好,直到昨天。我今天做出的唯一改變是添加這一行「this.requestWindowFeature(Window.FEATURE_NO_TITLE);」它聲稱拋出錯誤。請爲此提供解決方案。不能創建處理程序內部的線程,沒有調用looper準備

public class MainActivity extends Activity implements OnClickListener, Runnable { 
Context context; 

EditText editTextNum, editText, editUserName, editPassword; 
Button btnsend; 
ProgressDialog pd; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main);  
    editUserName = (EditText) findViewById(R.id.edit_userName); 
    editPassword = (EditText) findViewById(R.id.edit_password); 
    editTextNum = (EditText) findViewById(R.id.edit_number); 
    editText = (EditText) findViewById(R.id.edit_message);  
    btnsend = (Button) findViewById(R.id.btnsend); 
    btnsend.setOnClickListener(this); 
} 

/** Called when the user clicks the Send button */ 
public void sendMessage() { 
    if (!isOnline()) { 
     Toast.makeText(MainActivity.this,"No Internet Access..Cannot Send SMS", Toast.LENGTH_LONG).show(); 
    } else { 
     String userName = editUserName.getText().toString(); 
     String password = editPassword.getText().toString(); 
     String number = editTextNum.getText().toString(); 
     String message = editText.getText().toString(); 
     String msgreciever = number; 
     String testMessage = message; 
     try { 
      SmsSender.sendMessage(msgreciever, testMessage, userName, password); 
     } catch (Exception ex) { 
      Toast.makeText(MainActivity.this, "SMS Sending Failed.",Toast.LENGTH_LONG).show(); 
     } 

    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if (v == btnsend) { 
     if (!isOnline()) { 
      Toast.makeText(MainActivity.this,"No Internet Access..Cannot Send SMS",Toast.LENGTH_LONG).show(); 
     } else { 
      pd = ProgressDialog.show(MainActivity.this, "Free Sms","Sending SMS..Please Wait..!!", true); 
      Thread t = new Thread(this); 
      t.start(); 
     } 

    } 
} 

public void run() { 
    // TODO Auto-generated method stub 
    sendMessage(); 
    mHandler.sendEmptyMessage(0); 
} 

public Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     // TODO Auto-generated method stub 
     super.handleMessage(msg); 
     pd.dismiss(); 
     Toast.makeText(MainActivity.this, "Message Sent Successfully",Toast.LENGTH_LONG).show(); 
     editTextNum.setText(""); 
     editText.setText(""); 
     editTextNum.requestFocus(); 
    } 
}; 
} 

回答

4

看看我的帖子裏面解釋了這背後的原因:http://www.levinotik.com/2012/01/10/loopers-handlers-runtimeexceptions-explained/總之,你需要提供一些線索與一個活套的處理程序。你總是可以做到這一點new Handler(Looper.getMainLooper()):

另外,你不應該在活動內部管理自己的線程,或者至少不經常。你需要做的是按照我的說明創建Handler,然後調用mHandler.post(runnable),傳入要運行的runnable。你不必要地創建一個新線程,只需要調用它就可以啓動Runnable的run()方法。爲什麼不直接通過讓可運行的處理程序發佈來運行?

因此,它應該是這樣的:

Handler mHandler = new Handler(Looper.getMainLooper()); 

Runnable myRunnable = new Runnable() { 
public void run() {work here...} 
} 

...elsewhere 

mHandler.post(myRunnable); 

事實上,如果你這樣說,我會感到驚訝,如果它沒有,不許使用Looper.getMainLooper甚至工作();

編輯

我不知道SmsSender是什麼,但很可能是什麼造成你達到一個新的線程。如果SmsSender正在做一些長時間運行的工作,那麼你應該做的是使用一個AsyncTask在後臺完成這項工作。然後在onPostExecute中,您可以使用相關的whatevers更新您的UI。你似乎試圖自己實現AsyncTask的功能,雖然沒有成功。明白爲什麼?您正試圖在後臺執行一些昂貴的工作,然後通過使用處理程序讓UI更新狀態。這正是AsyncTask的目的是爲了幫助你,除了它正確地實現了所有這些,並且使你更容易。 :)

+0

仍然是同樣的問題.. –

+0

@TapanDesai看到我的編輯。 – LuxuryMode

+0

但是當我當時還沒有創建新線程時,當我點擊發送按鈕時,應用程序在執行代碼發送消息時凍結,所以看起來應用程序已被掛起。在創建瞭解決問題的新線程之後。也可以編輯我的代碼並提供解決方案。 –

0

這適用於我,但即時通訊使用ProgressDialog。

myProgressDialog = ProgressDialog.show(MyActivity.this, 
       getString(R.string.texto1) + "...", 
       getString(R.string.texto2) + "...", true); 
     myProgressDialog.getWindow().setType(
       WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 
     new Thread(new Runnable() {  
      public void run() {  
       runOnUiThread(new Runnable(){ 
        public void run() { 

         Toast t = Toast.makeText(getApplicationContext(), "cadena a mostrar", Toast.LENGTH_SHORT); 
         t.show(); 

        } 


       }); 
       myProgressDialog.dismiss(); 
      }       
     }).start(); 
相關問題