Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Activity.onCreate()创建永不消亡的线程_Android_Multithreading_Thread Safety - Fatal编程技术网

Android 从Activity.onCreate()创建永不消亡的线程

Android 从Activity.onCreate()创建永不消亡的线程,android,multithreading,thread-safety,Android,Multithreading,Thread Safety,我花了几个小时在这里寻找答案,但似乎没有什么能让我明白 我的问题是:我有一个带有主菜单的简单应用程序。其中一个选项从PHP服务器检索注释列表,更新数据库,然后显示ListView 里面一切正常。现在,每次我按back键然后再次启动活动时,都会启动一个新线程。我设法获得了50多个等待线程。我正在使用Eclipse中的DDMS选项卡来监视踏板 如果我尝试调用Looper.getLooper().quit()或Looper.myLooper().quit()我会收到一个错误,说“主线程不允许退出” 我

我花了几个小时在这里寻找答案,但似乎没有什么能让我明白

我的问题是:我有一个带有主菜单的简单应用程序。其中一个选项从PHP服务器检索注释列表,更新数据库,然后显示ListView

里面一切正常。现在,每次我按back键然后再次启动活动时,都会启动一个新线程。我设法获得了50多个等待线程。我正在使用Eclipse中的DDMS选项卡来监视踏板

如果我尝试调用
Looper.getLooper().quit()
Looper.myLooper().quit()
我会收到一个错误,说“主线程不允许退出”

我做错了什么?我应该在哪里/如何停止线程

public void onDestroy()
{
    Thread moribund = runner;
    runner = null
    moribund.interrupt();

}
代码如下:

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

}

您正在主(UI)线程中调用
Looper.quit()
方法,这是不允许的。尝试将
Runnable
发布到调用
Looper.quit()
的线程中的处理程序。这将导致线程上下文中的
循环器退出。

在onDestroy方法中,是否调用任何函数来停止线程

public void onDestroy()
{
    Thread moribund = runner;
    runner = null
    moribund.interrupt();

}
您正在主线程的循环器上调用quit()。不是线的活套

你可以试试这个。创建一个单独的私有内部类,扩展
线程
。在run()方法中,调用Looper.myLooper()将线程的Looper实例保存在类中。然后有一个quitting方法,在该循环器上调用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();
   }
}

Jack我已经这样做了,但线程仍然处于活动状态,isInterrupted()返回false。我要做的另一件事是向我的thread类添加requestedStop布尔值。并创建requestStop()方法将其设置为true。我在循环中添加了一个条件,该条件表示仅在以下情况下继续!请停止,谢谢,我已经搞定了。问题是我在活动中调用了
Looper.myLooper()
,而不是在线程中。我学到了艰苦的方法:)就是这样!我知道你不能在活动的
循环器上调用
quit()
,但我从来没有想过要在sde
run()
中调用线程循环器。再次感谢!