2

私は初心者のAndroidプログラマーです。いくつかのオンラインチュートリアルを見て始めたばかりで、自分でアプリケーションを作成することにしました。昨日までは正常に機能していました。今日行った唯一の変更は、この行「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

2 に答える 2

4

この背後にある理由を説明する私の投稿をチェックしてください:http://www.levinotik.com/2012/01/10/loopers-handlers-runtimeexceptions-explained/要するに、あなたはハンドラーにいくつかのスレッドからのルーパーを提供する必要があります。あなたはいつでもこれを行うことによってこれを得ることができますnew Handler(Looper.getMainLooper()):

また、アクティビティ内で独自のスレッドを管理するべきではありません。少なくとも通常はそうではありません。あなたがする必要があるのは、私が示したようにハンドラーを作成し、次にmHandler.post(runnable)を呼び出して、実行したいランナブルを渡します。Runnableのrun()メソッドが実行されるように、そのスレッドでstartを呼び出すことができるように、不必要に新しいスレッドを作成しています。ハンドラーポストを実行可能にすることで、直接実行しないのはなぜですか?

したがって、次のようになります。

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で、関連するものでUIを更新できます。失敗しましたが、AsyncTaskの機能を自分で実装しようとしているようです。理由がわかりますか?バックグラウンドで高価な作業を実行してから、ハンドラーを使用してUIをステータスで更新しようとしています。これは、AsyncTaskがこれらすべてを正しく実装し、簡単にすることを除いて、まさにあなたを支援することを目的としています。:)

于 2012-09-02T04:40:54.483 に答える
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();
于 2013-03-20T13:05:22.137 に答える