2016-02-19 74 views
-1

我有一個IME服務類和一個很長的操作方法。我想在IME服務類中的asyncTask類中運行LongOperation任務。asyncTask不適用於我

 public class Myimeservice extends InputMethodService 
     implements KeyboardView.OnKeyboardActionListene { 
    //... 
    //some code here.... 
    //... 

    public void setDictionary(){ 
      //.... 
    } 

private class LongOperation extends AsyncTask<String, Void, String> { 

     private Myimeservice parent; 

     public LongOperation(Myimeservice pim){ 
      parent = pim; 
     } 
     @Override 
     protected String doInBackground(String... params) { 
       Myimeservice tmp = new Myimeservice(); 
       tmp.setDictionary(); 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      //app.hideLoading(); 
     } 

     @Override 
     protected void onPreExecute() { 
      //app.showLoading(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 

當我運行它,應用程序被迫關閉。請幫幫我。

+2

請添加LogCat輸出,以便我們更好地瞭解錯誤是什麼。 – FlyingPumba

+0

您不需要重寫每個方法。只有這些你使用。 –

回答

1

我認爲這個錯誤在你的public void setDictionary()方法中的某處。 我假設你正在操作綁定到UIThread/MainThread的變量,由於doInBackground在另一個線程上,應用程序將崩潰。

取而代之的是讓setDictionary()方法返回字典並返回它,而不是doInBackground()中的「已執行」。

這將調用在UIThread/MainThread上運行的onPostExecute(Object result)

事情是這樣的:

private class LongOperation extends AsyncTask<String, Void, Dictionary> { 

@Override 
protected Dictionary doInBackground(String... params) { 
    Myimeservice tmp = new Myimeservice(); 
    Dictionary dict = tmp.setDictionary(); 
    return dict; 
} 

@Override 
protected void onPostExecute(Dictionary result) { 
       //do what ever you meant to do with it; 
} 

} 

如果你不希望從任何結果,你可以這樣做:

AsyncTask.execute(new Runnable() { 
      @Override 
      public void run() { 
       tmp.setDictionary(); 
      } 
     }); 
+0

setDictionary()方法僅處理服務的某些變量,並調用Myimeservice的一個方法,並且setDictionary()不返回任何內容(void)。我想在其他線程中完成這個繁重的工作。 – Mori

+0

我想從asynctask類調用Myimeservice的setDictionary()方法。請幫助我..... – Mori

+1

Runnable可能是一個比較好的選擇。但既然它崩潰了,你必須操縱UIThread變量。 而不是Myimeservice tmp = new Myimeservice();你不應該調用parent.setDictionary()? –

0

我用了Runnable代替的AsyncTask和解決的問題。

final Runnable r = new Runnable(){ 
     public void run(){ 
      setDictionary(); 
     } 
    }; 

此代碼是在onCreate()方法的服務。 坦克很多特里斯坦理查德。