这是我的代码。
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()函数运行但线程根本不起作用!
答案 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);