2016-10-25 4 views
0

Вот мой код.Thread работает только один раз

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. Проблема в том, что когда я возвращаюсь к предыдущему действию и открываю свою активность в списке, на этот раз появляется ошибка в их функции onClick. Функция showDialogFragment() работает, но нить не работает вообще!

ответ

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

Отлично! Это решение работало, хотя я не мог понять, как это сделать? –

+0

@ Yo'dilawar, вы пропустите функцию сна ... и, пожалуйста, также повысьте этот ответ ... спасибо –

0

Имейте в виду, что:

1) при переходе к предыдущей деятельности, onResume (метод) вызывается (и не снова OnCreate() метод, в котором запускается ваш метод). Таким образом, функция не начнется снова.

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