2013-10-19 42 views
0

我無法弄清楚如何使這項工作。Android - AsyncTask或線程同時恢復數據到SQLite

我正在開發一個應用程序,我從在線txt下載數據,解析並將其添加到我的數據庫。這需要+30秒,並且只有更新器的一部分被實現。

當我嘗試使用線程或Asynctask時,嘗試將參數傳遞給正在更新數據庫的void時遇到問題。

我該如何在好的方式上實現它?

這裏是我的代碼:

主要業務類:

public class Androideye_principal extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 


    //WhazzupUpdate.DownloadWhazzup(AllUsers, TotalConnections); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_androideye_principal); 

    PilotsSQLiteHelper pdbh = new PilotsSQLiteHelper(this, "PilotsDB", null, 1); 

    SQLiteDatabase dbPilots = pdbh.getWritableDatabase(); 

    Context context = getApplicationContext(); 


    String TotalConnections = new String(); 
    WhazzupUpdate.DownloadWhazzup(dbPilots, TotalConnections, context); 




    dbPilots.close(); 


    CharSequence text = "Total Users: " + TotalConnections; 
    int duration = Toast.LENGTH_LONG; 

    Toast toast = Toast.makeText(context, text, duration); 
    toast.show(); 

    [Continues with Buttons stuff and so on...] 

解析類:

public class WhazzupUpdate { 

public static void DownloadWhazzup (SQLiteDatabase PilotsDB, String TotalConnections, Context context) { 

    try { 
     // Create a URL for the desired page 
     URL url = new URL("This is my url/whazzup.txt"); 

     // Read all the text returned by the server 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
     String str; 
     for (int i = 0; i<=4; i++) { 
     in.readLine(); } // Go to the number of connections 
     TotalConnections = in.readLine(); 
     for (int i = 0; i<=3; i++) { 
      in.readLine(); } // Go to !CLIENTS 
     PilotsDB.execSQL("DELETE FROM Pilots"); 

     while (((str = in.readLine()) != null) && !(in.readLine().contains("!AIRPORTS"))) { 
      // str is one line of text; readLine() strips the newline character(s) 

      String[] dataRow = str.split(":"); 

      if (str.contains("PILOT")) { 
       ContentValues NewValue = new ContentValues(); 
       NewValue.put("VID", dataRow[1]); 
       [More NewValue puts...] 




      PilotsDB.insert("Pilots", null, NewValue); 

      } //End IF Pilot 


     } // End While 
     in.close(); 
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 

}} 

正如你看到的,我叫WhazzupUpdate.DownloadWhazzup法的主要活動,這就是當所有人都被凍結時,但不知道如何將其推演到另一個威脅,並保留對數據庫的引用,等等......

希望任何人都可以幫助我。提前致謝。

回答

0

A ThreadAsyncTask會很好。我更喜歡在我的大部分重物上使用AsyncTask。您可以創建AsyncTask,並在doInBackground()中完成您的工作,因爲它在背景Thread上工作。然後,您可以使用其他任何方法更新您的UI元素。結果從doInBackground()

onProgressUpdate()過去了,如果你需要通過調用publishProgress()期間doInBackground()操作來更新UI將運行後

onPostExecute()運行。在這裏,您可以顯示ProgressBar如果你需要

onPreExecute()將運行當你第一次之前doInBackground()運行打電話給你的任務。

使用ThreadAsyncTask在後臺線程中運行代碼將允許您的UI在繁重的工作完成時釋放。

Example of AsyncTask

Using interface with AsyncTask to post data back yo UI

AsyncTask Docs