2016-10-25 5 views
0

Hier ist mein Code.Thread läuft nur einmal

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

Diese Funktion wird von der OnCreate (Bundle) -Methode aufgerufen. Ich benutze eine Listenansicht in meiner Aktivität, von denen jede ein Dialogfragment für ihre onClick-Funktion öffnet. Das Problem ist, wenn ich zur vorherigen Aktivität zurückgehe und meine Listview-Aktivität öffne, gibt es diesmal einen Fehler in ihrer onClick-Funktion. Die Funktion showDialogFragment() läuft, aber Thread funktioniert überhaupt nicht!

Antwort

0

Sie können zu dieser Hoffnung versuchen diese Ihnen helfen kann ..

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

Great! Diese Lösung hat funktioniert, obwohl ich nicht verstanden habe wie? –

+0

@ Yo'dilawar, Du vermisst die Schlaffunktion..und bitte auch diese Antwort ... danke –

0

Beachten Sie, dass:

1), wenn Sie zur vorherigen Aktivität gehen, onResume Verfahren, bei dem Ihre Methode gestartet wird)() -Methode (und nicht wieder die onCreate (genannt wird). Die Funktion wird also nicht neu gestartet.

2) Der Thread gehört nicht zum Hauptthread, der den Aktivitätslebenszyklus regelt. Dies bedeutet, dass der Thread, der gestartet wird, seine Schleife fortsetzt, bis alle Ausführungen abgeschlossen sind, und dann stoppt. Ihr Lebenszyklus hängt nicht von einer der verschiedenen Aktivitäten ab.

Also ich denke, der Thread stoppt und wenn Sie zurück gehen, wird es nicht erneut gestartet.

0

Es ist nicht eine gute Praxis, ein Thema für Situationen wie zu verwenden, was du da drin hast. Stattdessen könnten Sie eine einfache AsyncTask verwenden: 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 
    } 
} 

Und die Art und Weise können Sie es verwenden:

new GrabAddressesTask().execute(sqlOpenHelper);