我花了最近几个小时在这里寻找答案,但似乎没有什么能让我明白。
这是我的问题:我有一个带主菜单的简单应用程序。其中一个选项从PHP服务器检索注释列表,更新数据库,然后显示ListView。
一切都在内部正常运作。现在,每次按下然后再次启动活动时,都会启动一个新线程。我设法超过50多个等待线程。我正在使用Eclipse的DDMS选项卡来监控踏板。
如果我尝试拨打Looper.getLooper().quit()
或Looper.myLooper().quit()
,我会收到错误消息“主线程不允许退出”。
我做错了什么以及我应该在何处/如何停止该线程?
以下是代码:
public class RequestActivity extends Activity {
ProgressDialog pDialog;
DatabaseHelper db;
int userId;
myCursorAdapter adapter;
Thread runner = null;
ListView list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
userId = myApplication.getInstance().getSession().getUserId();
setContentView(R.layout.request_list);
db = new myProvider.DatabaseHelper(this);
Cursor cursor = db.getRequests(userId);
startManagingCursor(cursor);
adapter = new myCursorAdapter(RequestActivity.this, cursor);
list = (ListView) findViewById(R.id.list);
list.setVisibility(View.INVISIBLE);
list.setAdapter(adapter);
pDialog = ProgressDialog.show(RequestActivity.this, "", "Loading ...", true, false);
runner = new Thread() {
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
adapter.getCursor().requery();
}
};
public void run() {
Looper.prepare();
// ... setup HttpGet
try {
// ... get HTTP GET response
if (response != null) {
// ... update database
handler.sendEmptyMessage(0);
}
} catch(Exception e) {
// .. log exception
}
Looper.loop();
}
};
runner.start();
}
private static class ViewHolder {
// .. view objects
}
private class myCursorAdapter extends CursorAdapter {
private LayoutInflater inflater;
public myCursorAdapter(Context context, Cursor c) {
super(context, c);
inflater = LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
// .. bind data
if (cursor.isLast()) {
pDialog.dismiss();
list.setVisibility(View.VISIBLE);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = inflater.inflate(R.layout.request_list_item, parent, false);
ViewHolder holder = new ViewHolder();
// .. set holder View objects
view.setTag(holder);
return view;
}
}
}
答案 0 :(得分:2)
你在主线程的Looper上调用quit()。不是线程的Looper。
你可以试试这个。创建一个扩展Thread
的独立私有内部类。在run()方法中,调用Looper.myLooper()以在类中保存线程的Looper实例。然后有一个退出方法,在该looper上调用quit。
示例:
private class LooperThread extends Thread{
private Looper threadLooper;
@Override
public void run(){
Looper.prepare();
threadLooper = Looper.myLooper();
Looper.loop();
}
public void stopLooper(){
if(threadLooper != null)
threadLooper.quit();
}
}
答案 1 :(得分:1)
您正在主(UI)线程中调用Looper.quit()
方法,这是不允许的。尝试将Runnable
发布到调用Looper.quit()
的线程内的处理程序。这将导致线程上下文中的Looper
退出。
答案 2 :(得分:1)
在您的onDestroy方法上,您是否进行任何调用以停止该线程?
public void onDestroy()
{
Thread moribund = runner;
runner = null
moribund.interrupt();
}