AsyncTask:executeOnExecutor和execute没有调用doInBackground()函数

3

以下代码在LG G3上测试成功,但是在三星Galaxy S3/S2上测试时,doInBackground()方法出现了某些原因未被调用。

检查API的代码:

  public void startBlat(String tosearch) {
    AsynctaskMovie asynctaskMovie = new AsynctaskMovie();
    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
        asynctaskMovie.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,tosearch);
    }
    else {
        asynctaskMovie.execute(tosearch);
    }

Asynctask 代码:
class AsynctaskMovie extends AsyncTask<String, String, ArrayList<Movie>> {

    JSONParser jsonParser = new JSONParser();
    private static final String SEARCH_URL = "http://www.omdbapi.com/?";


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        movieArrayList = new ArrayList();
        Log.i(getActivity().getCallingPackage(), "onPreExecute");
    }

    @Override
    protected ArrayList<Movie> doInBackground(String... args) {
        Log.i(getActivity().getCallingPackage(),"doInBackground");

        HashMap<String, String> params = new HashMap<>();
        params.put("s", args[0]);
        params.put("r", "json");
        JSONObject json = jsonParser.makeHttpRequest(SEARCH_URL, "GET", params);
        Log.i(getActivity().getCallingPackage(), json.toString());
        if (json != null) {
            try {
                if (json.getString("Response").equals("False")) {
                    return movieArrayList;
                }
            } catch (JSONException e) {
            }
            try {
                JSONArray jsonArray = json.getJSONArray("Search");
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
                    String movieid = jsonObject.getString(App.getInstance().IMDBimdbID);
                    if (!movieid.equals("null")) {
                        Movie movie = new Movie(movieid);
                        movieArrayList.add(movie);
                    }
                }
                jsonArray = new JSONArray();

                for (Movie movie : movieArrayList) {
                    params = new HashMap<>();
                    params.put("i", movie.getMovieid());
                    params.put("plot", "short");
                    params.put("r", "json");
                    JSONObject jsongetfullinfo = jsonParser.makeHttpRequest(SEARCH_URL, "GET", params);
                    if (jsongetfullinfo != null) {
                        jsonArray.put(jsongetfullinfo);
                        Log.i("", jsongetfullinfo.toString());
                    }
                }
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jObject = jsonArray.getJSONObject(i);
                    movieArrayList.get(i).updateFromIMDB(jObject);
                }
                for (Movie movie : movieArrayList) {
                    movie.setMovieposter(LoadFromUrl(movie.getPosterURL()));
                }
                return movieArrayList;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return movieArrayList;
    }

    @Override
    protected void onPostExecute(ArrayList<Movie> movieArrayList) {
        Log.i("ronen", "list size: " + movieArrayList.size());

        if (movieArrayList.size() > 0) {
            listView.setAdapter(new MovieAdapter(getActivity(), movieArrayList));
            listView.setVisibility(View.VISIBLE);
        } else {
            Toast.makeText(getActivity().getApplicationContext(), "No found", Toast.LENGTH_SHORT).show();
        }
    }

    private Bitmap LoadFromUrl(String theurl) {
        URL url = null;
        Bitmap bmp = null;
        try {
            url = new URL(theurl);
            bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        } catch (IOException e) {
        }
        return bmp;
    }
}

我不知道该如何解决这个问题。 根据我在这里阅读到的答案,代码似乎应该可以正常工作,但实际上并非如此。


重要通知 AsyncTask 无法同时工作。每次只能运行一个任务。 - user586399
当我启动这个异步任务时,没有其他异步任务在运行。 - Ronen Kryzel
1
@Kilanny 当然可以。请不要谈论你不太了解的事情。 - Marcin Orlowski
@Kilanny 不可以。在任何API上,您都可以同时运行多个异步任务。如果您不知道如何实现,请学习,但不要散布虚假信息说它无法完成。 - Marcin Orlowski
为什么想要并行运行你的AsyncTask。我认为这不推荐,你应该重新审查你的设计。文档在这里http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor, Params...) - umerk44
显示剩余3条评论
1个回答

0

看不出有任何可疑之处。

我建议在一个非常简单的应用程序上运行一个非常简单的AsyncTask,确保它能正常工作(如果不能,请尝试在模拟器上操作以确定问题是否与手机有关)

然后,逐步更改它以使其类似于您的代码,您会发现错误所在的位置。

祝你好运!


谢谢,最终的搜索链接是:link,应该是这样的。 - Ronen Kryzel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接