Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅在异步任务完成后才需要运行任务_Java_Android_Multithreading_Android Asynctask_Http Post - Fatal编程技术网

Java 仅在异步任务完成后才需要运行任务

Java 仅在异步任务完成后才需要运行任务,java,android,multithreading,android-asynctask,http-post,Java,Android,Multithreading,Android Asynctask,Http Post,如何确保异步任务在运行某些任务之前完成。我需要在异步任务更改变量值后使用该变量。如果我在异步运行之前运行代码,那么我就完蛋了。有什么帮助吗?我显然是异步任务的新手。如果你看一下我的代码,我可能并没有像预期的那样使用onPostExecute(),所以建议会很有帮助。我最初的想法是继续向异步任务中添加内容,但我认为这是一种糟糕的做法,因为我有大量的内容必须串联运行。基本上,我认为它归结为:如何确保UI线程中的任务在异步任务完成之前不会开始运行 public class MainActivity e

如何确保异步任务在运行某些任务之前完成。我需要在异步任务更改变量值后使用该变量。如果我在异步运行之前运行代码,那么我就完蛋了。有什么帮助吗?我显然是异步任务的新手。如果你看一下我的代码,我可能并没有像预期的那样使用onPostExecute(),所以建议会很有帮助。我最初的想法是继续向异步任务中添加内容,但我认为这是一种糟糕的做法,因为我有大量的内容必须串联运行。基本上,我认为它归结为:如何确保UI线程中的任务在异步任务完成之前不会开始运行

public class MainActivity extends MapActivity {
myJSONmap;

public void onCreate(Bundle savedInstanceState) {
new AsyncStuff().execute();
locatePlace(myJSONmap);

 class AsyncStuff extends AsyncTask<Void, Integer, JSONObject> {
            @Override
            protected JSONObject doInBackground(Void... params) {
                jObject = GooglePlacesStuff.getTheJSON(formatedURL);
                return null;
            }
            @Override
            protected void onPostExecute(JSONObject result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                myJSONmap = JSONextractor.getJSONHMArrayL(jObject);  // getting the parsed data from the JSON object.
                //the arraylist contains a hashmap of all the relevant data from the google website.
            }
        }
public类MainActivity扩展了MapActivity{
myJSONmap;
创建时的公共void(Bundle savedInstanceState){
新建AsyncStuff().execute();
地点地点(myJSONmap);
类AsyncStuff扩展了AsyncTask{
@凌驾
受保护的JSONObject doInBackground(无效…参数){
jObject=GooglePlacesStuff.getTheJSON(formatterl);
返回null;
}
@凌驾
受保护的void onPostExecute(JSONObject结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
myJSONmap=JSONextractor.getJSONHMArrayL(jObject);//从JSON对象获取解析数据。
//arraylist包含来自google网站的所有相关数据的hashmap。
}
}

您可以使用下面的代码执行异步任务-

MyAsyncTask_a asyncTask_a = new MyAsyncTask_a();
                        asyncTask_a.execute();
完成doInBackground()任务后,只有控件才会转到postExecute()。 您不能在doInBackground中执行任何UI操作,但可以在preExecute()和postExecute()中执行

类MyAsyncTask\u扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的整数doInBackground(无效…arg0){
//TODO自动生成的方法存根
返回1;
}
@凌驾
受保护的void onPostExecute(整数结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
}
}

希望这能对您有所帮助。

您可能想了解更多关于Android Developer上AsyncTask的信息

关于提示,我个人的选择是将布尔值传递给onPostExecute。这样,您可以评估doInBackground是否成功,然后确定要做什么(错误消息或更新布局)

请记住,在onPostExecute方法中,理想情况下应该只更新屏幕,假设数据正常

myJSONmap = JSONextractor.getJSONHMArrayL(jObject);
在doInBackground?然后打电话

locatePlace(myJSONmap);
像这样:

class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
    String errorMsg;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(Void... v) {
        try{
            jObject = GooglePlacesStuff.getTheJSON(formatedURL);
            myJSONmap = JSONextractor.getJSONHMArrayL(jObject);
            //do stuff
            return true;
        } catch (JSONException e){
            errorMsg="Something wrong in the json";
            return false;
        }

    }

    @Override
    protected void onPostExecute(Boolean success) {
        if(success){
            locatePlace(myJSONmap);
            //update layout
        } else {
            //show error
        }


    }
}
类MyAsyncTask扩展了AsyncTask{ 字符串errorMsg; @凌驾 受保护的void onPreExecute(){ super.onPreExecute(); } @凌驾 受保护整数doInBackground(Void…v){ 试一试{ jObject=GooglePlacesStuff.getTheJSON(formatterl); myJSONmap=JSONextractor.getJSONHMArrayL(jObject); //做事 返回true; }捕获(JSONException e){ errorMsg=“json中有错误”; 返回false; } } @凌驾 受保护的void onPostExecute(布尔值成功){ 如果(成功){ 地点地点(myJSONmap); //更新布局 }否则{ //显示错误 } } }
这不是我已经在做的事情吗?我的问题是:如何确保在异步任务完成之前UI线程中的任务不会运行。将您想要执行的内容放在onPostExecute函数中。即只需在onPostExecute中调用locatePlace。将您想要在UI线程中运行的所有内容放在PostExecute中。返回1表示su当doInBackground块结束后,它只会转到post execute并在那里运行命令,因此基本上我剩下的所有活动都将在onPostExecute()方法中进行?这是一个好做法吗?是的,onPostExecute()是任务完成后需要执行的操作。onPostExecute()中可能有许多行代码。这样可以吗?当然,假设您需要更新整个布局,这可能需要几行。或者创建一个对话框。您甚至可以在活动中调用另一个函数。但是请记住,如果不需要在主线程中执行此操作,请将其放在doInBackground()中,这样就不会阻止主活动线程。请尝试在onPostExecute()上只保留布局更新如果可以的话。我想我现在明白了。所以简单地总结一下:1.使用主线程启动活动。2.使用背景进行计算。3.使用后执行处理依赖于背景线程完成的事情
class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
    String errorMsg;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(Void... v) {
        try{
            jObject = GooglePlacesStuff.getTheJSON(formatedURL);
            myJSONmap = JSONextractor.getJSONHMArrayL(jObject);
            //do stuff
            return true;
        } catch (JSONException e){
            errorMsg="Something wrong in the json";
            return false;
        }

    }

    @Override
    protected void onPostExecute(Boolean success) {
        if(success){
            locatePlace(myJSONmap);
            //update layout
        } else {
            //show error
        }


    }
}