线程只运行一次

时间:2016-10-25 13:18:53

标签: android multithreading

这是我的代码。

public void showCallFragment(){

        address_phone = new ArrayList<>();
           Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {

                    OyumDataBaseHelper dbh = new OyumDataBaseHelper(Address_Activity.this);

                    dbh.OpenDatabase();
                    for (int i = 0; i < addressIds.size(); i++) {
                        Cursor cr1 = dbh.getPhone(addressIds.get(i));

                        cr1.moveToFirst();

                        ArrayList<String> phoneList = new ArrayList<>();

                        do {
        phoneList.add(cr1.getString(cr1.getColumnIndex(TableData.TableInfo.ph_phone_number)));

                        } while (cr1.moveToNext());

                        address_phone.add(phoneList);

                        cr1.close();

                    }

                }
            });

            thread1.start();
    }

从OnCreate(Bundle)方法调用此函数。我在我的活动中使用listview,每个都在onClick函数上打开dialogFragment。问题是当我回到之前的活动,并打开我的listview活动时,这次他们的onClick函数出错了。 showDialogFragment()函数运行但线程根本不起作用!

3 个答案:

答案 0 :(得分:0)

请记住:

1)当您转到上一个Activity时,将调用onResume()方法(而不是再次启动方法的onCreate()方法)。所以这个功能不会重新开始。

2)线程不与主线程一起使用,主线程是调节活动生命周期的主线程。这意味着启动的线程继续循环,直到所有执行完成,然后停止。它的生命周期并不取决于各种活动之一。

所以我认为线程会停止,当你回去时,它不会再次启动。

答案 1 :(得分:0)

你可以尝试这个希望,这可以帮助你..

Thread thread1 = new Thread() {
        public void run() {
            try {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
           //your code here
                    }
                });
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
   thread1.start();

答案 2 :(得分:0)

线程用于您所拥有的情况并不是最佳做法。相反,你可以使用一个简单的AsyncTask: https://developer.android.com/reference/android/os/AsyncTask.html

static class  GrabAddressesTask extends   AsyncTask<SQLiteOpenHelper,Void, List<String>>{

    @Override
    protected List<String> doInBackground(SQLiteOpenHelper... params) {
        final List<String> addresses=new ArrayList<>();
        final SQLiteDatabase db=params[0].getReadableDatabase();
        try{
            // get your addresses here and update the List
        }
        finally {
            db.close();
        }
        return addresses;
    }

    @Override
    protected void onPostExecute(List<String> stringList) {
        super.onPostExecute(stringList);
        // update your UI in here
        // make sure you do not keep a strong reference to you Activity/Fragment in this class
        // if you need a reference just use a WeakReference
    }
}

你可以使用它的方式:

new GrabAddressesTask().execute(sqlOpenHelper);