Android 等待AsyncTask获取数据,然后在UI线程中执行某些操作

Android 等待AsyncTask获取数据,然后在UI线程中执行某些操作,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我创建了一个AsyncTask实例,它调用web服务,获取数据并将其转换为字符串。我想根据从AsyncTask获取的字符串更新一些图片。(如果我的应用程序数据文件夹中不存在某些图像URL,则字符串中包含我要下载的图像URL) 我的问题是:UI线程和AsyncTask线程并行执行,我希望确保结果字符串(来自AsyncTask)不为空,然后决定是否需要下载新图像。如果需要,下载照片并在我的应用程序中的某个位置更改布局。 如何确保AsyncTask已完成其任务? 请告诉我你的建议或写代码 这是我的代码

我创建了一个
AsyncTask
实例,它调用web服务,获取数据并将其转换为字符串。我想根据从
AsyncTask
获取的字符串更新一些图片。(如果我的应用程序数据文件夹中不存在某些图像URL,则字符串中包含我要下载的图像URL)
我的问题是:UI线程和
AsyncTask
线程并行执行,我希望确保结果字符串(来自
AsyncTask
)不为空,然后决定是否需要下载新图像。如果需要,下载照片并在我的应用程序中的某个位置更改布局。
如何确保
AsyncTask
已完成其任务?

请告诉我你的建议或写代码

这是我的代码,
活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.more_apps_layout);

    android.os.Debug.waitForDebugger();

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    height = displaymetrics.heightPixels;
    width = displaymetrics.widthPixels;

    ReceiveTask r = new ReceiveTask();
    r.execute();

    if (DataFromWebService != null)
        Log.v("sina", DataFromWebService); // !! DataFromWebService is null because AsyncTask hasn't done its task
    else
        Log.v("sing", "null");
}  
AsynTask:

class ReceiveTask extends AsyncTask<Void, Void, String>{
    @Override
    protected String doInBackground(Void... params) {
        String result = null;
        JSONObject json = new JSONObject();
        try {
            json.put("command", "adv");
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        HttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
        HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
        HttpClient client = new DefaultHttpClient(httpParams);


        // ??? here coms web service!!!
        String url = "http://sina.greenbirdstudio.com/adv.php";

        try {
            HttpPost request = new HttpPost(url);
            request.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
            request.setHeader("json", json.toString());
            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();

            // If the response does not enclose an entity, there is no need
            if (entity != null) {
                InputStream instream = null;
                instream = entity.getContent();

                //result = RestClient.convertStreamToString(instream);

                BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
                StringBuilder sb = new StringBuilder();

                String line = null;
                try {
                    while ((line = reader.readLine()) != null)
                        sb.append(line + "\n");
                } catch (IOException e) {
                    e.printStackTrace();
                    DataFromWebService = e.toString();
                } finally {
                    try {
                        instream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        DataFromWebService = e.toString();
                    }
                }
                result = sb.toString();
            } else {
                Log.v("chize khar", " chize khar");
            }
        } catch (Exception t) {
            result = t.toString();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        DataFromWebService = result;
    }
class ReceiveTask扩展了AsyncTask{
@凌驾
受保护字符串doInBackground(无效…参数){
字符串结果=null;
JSONObject json=新的JSONObject();
试一试{
put(“命令”、“adv”);
}捕获(JSONException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
HttpParams HttpParams=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,超时0毫秒);
HttpConnectionParams.setSoTimeout(httpParams,超时0毫秒);
HttpClient=新的默认HttpClient(httpParams);
//???这里是coms web服务!!!
字符串url=”http://sina.greenbirdstudio.com/adv.php";
试一试{
HttpPost请求=新的HttpPost(url);
setEntity(新的ByteArrayEntity(json.toString().getBytes(“UTF8”));
setHeader(“json”,json.toString());
HttpResponse response=client.execute(请求);
HttpEntity=response.getEntity();
//如果响应没有包含实体,则不需要
如果(实体!=null){
InputStream instream=null;
instream=entity.getContent();
//结果=RestClient.convertStreamToString(流内);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(instream));
StringBuilder sb=新的StringBuilder();
字符串行=null;
试一试{
而((line=reader.readLine())!=null)
sb.追加(第+行“\n”);
}捕获(IOE异常){
e、 printStackTrace();
DataFromWebService=e.toString();
}最后{
试一试{
流内关闭();
}捕获(IOE异常){
e、 printStackTrace();
DataFromWebService=e.toString();
}
}
结果=sb.toString();
}否则{
Log.v(“chize-khar”、“chize-khar”);
}
}捕获(异常t){
结果=t.toString();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
DataFromWebService=结果;
}

顾名思义
asynchtask
运行异步而非同步,因此

if (DataFromWebService != null)
        Log.v("sina", DataFromWebService); // !! DataFromWebService is null because AsyncTask hasn't done its task
    else
        Log.v("sing", "null");
}  
在AsyncTask的
onPostExecute()

或者只使用AsyncTask的
get()
方法,该方法将等待AsyncTask完成,但会阻塞UI线程


注意:但我不建议使用
.get()
方法。只需在
onPostExecute()中使用
DataFromWebService
,这是一个很好的做法。

onPostExecute()中做你想做的一切
method.

将AsyncTask设置为AsyncTask意味着在doInBackground中的任务在doPostExecute()中完成后,您将获得一些字符串。因此,只需从doInBackground发送任何字符串,这样您就知道您的过程已完成,并将特定字符串检查到doPostExecute方法中。谢谢帮助。您能告诉我下载照片的方式和地点吗?在
doInBackground
内部运行另一个线程或其他内容。在
doInBackground()中下载照片
的AsyncTask,并更新AsyncTask的
onPostExecute()
中的照片。。