2012-12-21 50 views
0

我有兩個進程並行運行和相同的數據庫上的讀寫操作。所以我想把他們帶到一個異類,所以他們彼此同步。但在實施過程中,產生了一個錯誤,我不知道如何修復期望人們的幫助。當您將應用程序運行到新同步()時,您可能會收到以下錯誤消息: 。執行 ();錯誤錯誤,當使用asynctask

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.invoice); 
doTimerTask(); 
} 

public void workoffline() 
{ 
    clearArray(); 
    try { 
     mDb.openDB(); 
     Cursor mCursor = mDb.getAllInvoice(IDDelivery); 
     if (mCursor.moveToFirst()) { 
      do { 
       codeInvoiceArray.add(mCursor.getString(1)); 
       nameArray.add(mCursor.getString(2)); 
       phonenumberArray.add(mCursor.getString(3)); 
       addressArray.add(mCursor.getString(4)); 
       urlArray.add(mCursor.getString(5)); 

      } while (mCursor.moveToNext()); 
      loaddatalistview(); 
     } 
     mDb.closeDB(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

// lấy dữ liệu từ server về thiết bị 
public void loaddata() 
{ 

    String sampleURL = SERVICE_URL + "/monthlytarget.php"; 
    CallUrl wst = new CallUrl(CallUrl.GET_TASK, this, "Lấy thông tin hóa đơn...", 1, IDDelivery); 
    wst.execute(new String[] { 
      sampleURL 
    }); 

    // Hiển thị thông tin nhận được lên listview 

} 

private class sync extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     loaddata(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(final Void unused) { 
     // TODO Auto-generated method stub 
     workoffline(); 
    } 

} 

// kiểm tra thiết bị có kết nối mạng hay không? 
// nếu có thiết bị sẽ làm việc online 
// nếu không thiết bị sẽ chuyển sang hoạt động offline 
public void testNetwork() 
{ 
    // Kiểm tra kết nối đến server 
    TestConnectionNew test = new TestConnectionNew(); 
    try { 
     String recieve = test.execute("http://longvansolution.tk/monthlytarget.php").get(); 
     if (recieve.equalsIgnoreCase("true") && isNetworkAvailable() == true) 
     { 

      //loaddata(); 
      // workoffline(); 
      new sync().execute(); 
     } 
     else if (recieve.equalsIgnoreCase("false") || isNetworkAvailable() == false) 
     { 
      String mess = "Không thể kết nối đến server hoặc thiết bị chưa có kết nối mạng!"; 
      Toast.makeText(Invoice.this, mess, Toast.LENGTH_SHORT).show(); 
      workoffline(); 
     } 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
} 

// thực hiện load data từ server về theo thời gian định sẵn 
public void doTimerTask() { 
    TimerTask mTimerTask; 
    Timer t = new Timer(); 
    final Handler handler = new Handler(); 
    mTimerTask = new TimerTask() { 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        testNetwork(); 
        Log.d("TIMER", "TimerTask run"); 
       } 
      }); 
     } 
    }; 
    // public void schedule (TimerTask task, long delay, long period) 
    t.schedule(mTimerTask, 500, 300000); // 
} 

錯誤

12-21 14:43:54.750: E/AndroidRuntime(11093): FATAL EXCEPTION: AsyncTask #4 
12-21 14:43:54.750: E/AndroidRuntime(11093): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at  java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.lang.Thread.run(Thread.java:856) 
12-21 14:43:54.750: E/AndroidRuntime(11093): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.Handler.<init>(Handler.java:121) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.app.Dialog.<init>(Dialog.java:107) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.app.AlertDialog.<init>(AlertDialog.java:114) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.app.AlertDialog.<init>(AlertDialog.java:98) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.app.ProgressDialog.<init>(ProgressDialog.java:77) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at Url.CallUrl.showProgressDialog(CallUrl.java:289) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at Url.CallUrl.onPreExecute(CallUrl.java:300) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.AsyncTask.execute(AsyncTask.java:511) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at com.longvan.saigonfleamarket.Invoice.loaddata(Invoice.java:240) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at com.longvan.saigonfleamarket.Invoice$sync.doInBackground(Invoice.java:254) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at com.longvan.saigonfleamarket.Invoice$sync.doInBackground(Invoice.java:1) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
12-21 14:43:54.750: E/AndroidRuntime(11093): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
+0

你更新UI在'loaddata()'方法? –

+0

使用SystemClock.sleep(2000);在加載數據之前在doInBackgroud()內部。 – Unknown

回答

0

是CallUrl試圖表明一個ProgressDialog?如果是這樣,你不能從AsyncTask的doInBackground方法做到這一點。相反,請看一下publishProgress方法。

Docs這裏。

+0

這是行不通的。他正從另一個'AsyncTask'' doInBackground(...)'方法執行'AsyncTask'。這意味着通常在UI線程上運行的第二個「AsyncTask」方法實際上在第一個爲其「doInBackGround」方法工作的「AsyncTask」工作線程上運行。異常是由於第二個'AsyncTask'嘗試在其'onPreExecute'方法中顯示進度對話框而引起的。 – Squonk

0

在調用異步任務之前創建一個PorgressDialog,並在完成異步任務完成後關閉PorgressDialog。這將解決您的問題。在這裏檢查here hereherehere

+0

這裏的問題是在CallUrl類中需要使用的PorgressDialog,因爲有很多活動並且使用這個類。 –

+0

如果答案有用,請投票給我 – kumar

0

您將不得不在UI線程中運行UI交互。 試試做

runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 

        //your UI interaction code here 

       } 
      }); 

這將執行UI線程中的代碼。

0

從你的用戶界面線程(默認)創建一個TimerTask線程,並從中創建一個Runnable(線程),並從中創建一個AsyncTask線程。在這之中,你有一個Toast電話:(你不能直接從這樣的另一個線程訪問UI線程;嘗試處理)

Toast.makeText(Invoice.this, mess, Toast.LENGTH_SHORT).show(); 

我相信一些簡化是在訂購;這裏有一些很好的例子,應該幫助:

AsyncTask and Looper.prepare() error

Can't create handler inside thread that has not called Looper.prepare() - AsyncTask inside a dialog

Java Can't create handler inside thread that has not called Looper.prepare()

Timer & TimerTask versus Thread + sleep in Java