0

私のプロジェクトのアクティビティのコードは次のとおりです。

    CustomClass custom = new CustomClass(); 
    //Passing an array list
    result = custom.getResults(list);

これCustomClassはライブラリ プロジェクトのクラスで、メソッドgetResults(list)AsyncTask.

getResults()方法 :

    public List<String> getResults(List<String> string){        
        List<String> result= new ArrayList<String>();
        BackgroundTask task =  new BackgroundTask();
        task.execute(string);
        result= task.get();
        return result;
    }

私の非同期タスク:

    public class BackgroundTask extends AsyncTask<List<String>, Integer, List<String> >{
    List<String> results= new ArrayList<String>();
    @Override
    protected List<String> doInBackground(List<String>... params) {
        for (int i=0; i<params[0].size();i++) {
            // someOperation
        }
        return results; 
    }
    @Override
    protected void onPostExecute(List<String> result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }


}

問題:AsyncTaskが開始されていません。デバッグしてAsyncTaskクラスに入ろうとすると、 が表示されますThe source attachment does not contain the source for the file classloader.class。誰かがここで私を助けることができますか? ありがとうございました。

4

1 に答える 1

1

get() メソッドは UI スレッドをブロックします。つまり、onPreExecute は実行できません (UI スレッドで実行する必要があります)。したがって、バックグラウンド スレッドが開始されることはありません。

get() の呼び出しを取り除き、「値を返す」ロジックを onPostExecute に移動します。

また、UI スレッドにいるときは決してブロックしないでください。

于 2013-09-13T17:46:38.723 に答える