【问题标题】:AsyncTask setting priorityAsyncTask 设置优先级
【发布时间】:2017-06-16 21:14:34
【问题描述】:

我有一个 AsyncTask(.execute()) 和一个 onPostExecute 方法。此方法启动另一个AsyncTask(.execute()),在继续执行第一个onPostExecute 之前需要完成该操作。是否可以暂停第一个线程并等待第二个线程完成?我需要第二个postExecute 方法的结果才能完成第一个postExecute

以下示例:

public class RetrieveData extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... strings) {
        HttpURLConnection conn = null;
        try {
            URL url = new URL(strings[0]);
            conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("GET");

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String linieNoua = "";
            String crlf = System.getProperty("line.separator");
            StringBuilder sb = new StringBuilder();
            while((linieNoua = br.readLine()) != null) {
                sb.append(linieNoua);
                sb.append(crlf);
            }
            conn.disconnect();
            return sb.toString();
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

RetrieveData retrieveData = new RetrieveData() {
        @Override
        protected void onPostExecute(String s) {
            if (s != null) {
               retrieveTransport(transportRegNr);
            } else {
                Toast.makeText(getApplicationContext(), R.string.login_server_error, Toast.LENGTH_LONG).show();
            }
        }
    };
    retrieveData.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"http://192.168.0.101:3000/route/" + prefs.getString("email",null));
}

private void retrieveTransport(String regNr){

    RetrieveData retrieveData = new RetrieveData() {
        @Override
        protected void onPostExecute(String s) {
            if (s != null) {
                try {
                    JSONObject jsonObject = new JSONObject(s);

                    String model = jsonObject.getString("model");
                    String regNr = jsonObject.getString("regNr");
                    int type = jsonObject.getInt("type");
                    int seats = jsonObject.getInt("seats");

                    t = new Transport(model,regNr,null,seats,type);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            } else {
                Toast.makeText(getApplicationContext(), R.string.login_server_error, Toast.LENGTH_LONG).show();
            }
        }
    };
    retrieveData.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"http://192.168.0.101:3000/transport/registryNr/" + regNr);
}

如果我使用execute 方法,则永远不会调用来自retrieveTransport(String regNr)onPostExecute。如果我使用executeOnExecutor,它们会同时运行,这也不好。我需要完成第一个retrieveTransport;没有它,我无法继续第一个onPostExecute

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    使用

    getStatus()

    检查 AsyncTask 是否处于挂起、运行或完成状态。以及何时启动新任务。例如:

    if(retrieveTransport.getStatus() == AsyncTask.Status.PENDING){
        // My AsyncTask has not started yet
    }
    
    if(retrieveTransport.getStatus() == AsyncTask.Status.RUNNING){
        // My AsyncTask is currently doing work in doInBackground()
    }
    
    if(retrieveTransport.getStatus() == AsyncTask.Status.FINISHED){
        // START NEW TASK HERE
    }
    

    您的应用示例:

            if (retrieveTransport!= null && retrieveTransport.getStatus() == AsyncTask.Status.FINISHED) {
               //START retrieveData TASK HERE
            }
            else
            {
              //IGNORE 
            }
    

    【讨论】:

    • 这是个好主意,但我不能忽略该数据,我试图放置一个 while 循环但应用程序崩溃......
    猜你喜欢
    • 2013-06-26
    • 2014-10-27
    • 1970-01-01
    • 2012-12-07
    • 2014-10-28
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多