2012-09-02 2 views
2

나는 안드로이드 프로그래머입니다. 그냥 일부 온라인 자습서를 보면서 시작, 나 자신을 위해 응용 프로그램을 만들기로 결정 .. 그것은 어제까지 잘 작동했다 .. 오늘 내가 만든 유일한 변화는이 라인을 추가하는 것이었다 "this.requestWindowFeature (Window.FEATURE_NO_TITLE);" 그리고 그것은 오류를 던지고있다. pls이 솔루션을 제공합니다.루퍼를 호출하지 않은 스레드 내에서 핸들러를 만들 수 없습니다.

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() 메소드가 실행되도록 start를 호출 할 수 있도록 불필요하게 새로운 Thread를 생성한다. 왜 핸들러 포스트를 실행 가능하게함으로써 직접적으로 실행시키지 않을까요? 당신이 이런 식으로 할 경우는 Looper.getMainLooper을 사용하지 않고도 작동하지 않은 경우

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

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

...elsewhere 

mHandler.post(myRunnable); 

사실은, 내가) (놀라실 겁니다;

은 그래서 같이한다

편집

내가 SmsSender이 무엇인지 모르겠지만, 그건 당신이 새로운 Thread 도달하는 원인을 가능성이 것입니다. SmsSender가 장기간 실행되는 작업을 수행한다면, AsyncTask를 사용하여 백그라운드에서 작업을 수행하십시오. 그런 다음 onPostExecute에서 관련 whatevers로 UI를 업데이트 할 수 있습니다. 당신은 실패하더라도 자신이 AsyncTask의 기능을 구현하려고하는 것 같습니다. 왜? 백그라운드에서 값 비싼 작업을 한 다음 Handler를 사용하여 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(); 
관련 문제