我有一个IME服务类和一个长操作方法。我想在IME服务类中的asyncTask类中运行LongOperation任务。
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) {}
}
当我运行它时,应用程序被迫关闭。请帮帮我。
答案 0 :(得分:1)
我认为错误发生在public void setDictionary()
方法的某处。
我假设您正在操作绑定到UIThread / MainThread的变量,应用程序将崩溃,因为doInBackground在另一个Thread上。
而是让setDictionary()
方法返回字典并返回它而不是&#34;执行&#34;在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();
}
});
答案 1 :(得分:0)
我使用Runnable而不是AsyncTask,问题解决了。
final Runnable r = new Runnable(){
public void run(){
setDictionary();
}
};
此代码位于onCreate()服务方法中。 坦克很多特里斯坦理查德。