簡體   English   中英

線程只運行一次

[英]Thread runs only one time

這是我的代碼。

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)方法中調用此函數。 我在活動中使用一個列表視圖,每個列表視圖在其onClick函數上打開一個dialogFragment。 問題是,當我返回上一個活動並打開我的listview活動時,這次他們的onClick函數出現錯誤。 函數showDialogFragment()運行,但是線程根本不起作用!

請記住:

1)當您轉到上一個活動時,將調用onResume()方法(而不是再次在其中啟動您的方法的onCreate()方法)。 因此該功能不會再次啟動。

2)線程與主線程不匹配,主線程是調節活動生命周期的主線程。 這意味着啟動的線程繼續其循環,直到完成所有執行,然后停止。 它的生命周期不取決於各種活動之一。

所以我認為線程停止了,當您返回時,它不會再次啟動。

您可以嘗試這樣做,希望對您有所幫助。

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

在您所處的環境中使用線程不是最佳實踐。 相反,您可以使用一個簡單的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM