gpt4 book ai didi

android - 无法在尚未调用 looper prepare 的线程内创建处理程序

转载 作者:搜寻专家 更新时间:2023-11-01 08:08:23 25 4
gpt4 key购买 nike

我是新手 android 程序员。刚开始看到一些在线教程,我决定自己申请一个。直到昨天它都运行良好。我今天做的唯一改变是添加这一行“this.requestWindowFeature(Window.FEATURE_NO_TITLE);”它说抛出错误。请为此提供解决方案。

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();
}
};
}

最佳答案

查看我的帖子,其中解释了这背后的原因:http://www.levinotik.com/2012/01/10/loopers-handlers-runtimeexceptions-explained/简而言之,您需要从某个线程向 Handler 提供 Looper。你总是可以通过执行 new Handler(Looper.getMainLooper()):

来获得它

此外,您不应该在 Activity 中管理自己的线程,或者至少通常不应该。您需要做的是像我展示的那样创建处理程序,然后调用 mHandler.post(runnable),传入您要运行的可运行对象。您不必要地创建了一个新线程,这样您就可以在其上调用 start 以便执行 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 中,您可以使用相关的任何内容更新您的 UI。您似乎正在尝试自己实现 AsyncTask 的功能,尽管没有成功。明白为什么了吗?您正在尝试在后台执行一些昂贵的工作,然后使用处理程序让 UI 更新状态。这正是 AsyncTask 旨在帮助您的,除了它正确地实现了所有这些并使您轻松。 :)

关于android - 无法在尚未调用 looper prepare 的线程内创建处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com