Android如何在继续之前等待代码完成

时间:2011-08-22 15:38:00

标签: java android hyperlink android-asynctask

我有一个名为hostPhoto()的方法;它基本上将图像上传到网站并检索链接。 然后,我有另一种方法将链接发布到网站。

现在我使用这种方法的方式是这样的:

String link = hostPhoto(); //returns a link in string format

post(text+" "+link); // posts the text + a link.

我的问题是...... hostPhoto()上传和检索链接需要几秒钟, 我的程序似乎不等待并继续发布,因此我将链接保留为null,

无论如何,我可以让它首先获得链接...然后发布? 喜欢某种onComplete?或类似的东西.. 我认为上面的方法可以工作,但是通过做Log.i,似乎链接在一秒左右后返回到字符串。

更新:这是我的问题的更新进度,我使用AsyncTask作为通知,但Log.i的错误显示urlLink为空...这意味着从hostphoto请求的链接永远不会回来的时间日志..

更新2:最终工作!问题是hostPhoto()中的线程,是否有人可以为我提供一个探索,为什么该线程会导致这个? 感谢所有回复的人。

private class myAsyncTask extends AsyncTask<Void, Void, Void> {
    String urlLink;
    String text;
    public myAsyncTask(String txt){

        text=txt;
    }

    @Override
    protected Void doInBackground(Void... params) {
        urlLink=hostPhoto();
        //Log.i("Linked", urlLink);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        try {
            Log.i("Adding to status", urlLink);
            mLin.updateStatus(text+" "+urlLink);
            Log.i("Status:", urlLink);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

hostPhoto()执行此操作:

            String link;  new Thread(){

                @Override
                public void run(){
                    HostPhoto photo = new HostPhoto(); //create the host class


                    link= photo.post(filepath); // upload the photo and return the link
                    Log.i("link:",link);
                }
            }.start();

5 个答案:

答案 0 :(得分:10)

您可以在这里使用AsyncTask,

AsyncTask

通过使用它,您可以执行

的代码

hostPhoto()

在doInBackground()中

然后执行

的代码

post(text+" "+link);

在onPostExecute()方法中,这将是您的最佳解决方案。

您可以使用此模式编写代码

private class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... params) {
        hostPhoto();
        return null;
    }
   @Override
   protected void onPostExecute(Void result) {
        post(text+" "+link);
    }
 }

并且可以使用

执行它
 new MyAsyncTask().execute();

答案 1 :(得分:2)

我假设您(或应该)使用单独的线程来异步完成此操作。

您需要将post()置于hostPhoto()完成时调用的回调中。

通常情况下,我使用Android AsyncTask完成此操作...

这为您提供了回复onPostExecute(),您可以在其内部执行post()

答案 2 :(得分:0)

您可以使用AsyncTask,请参阅this

编辑:他是asynctask的视频tutorial,或参考此示例示例:clic here

答案 3 :(得分:0)

您可能需要查看callback pattern in Java

答案 4 :(得分:0)

关于你的第二个问题:

  

有人可以向我解释为什么该线程会有   引起了这个?

您拨打&#34; link = photo.post(filepath);&#34;它正在一个新线程上运行。 当该方法仍在运行时,链接仍然为null,并且您当前的线程(主线程)继续使用该链接运行(当时为null)

在这种情况下你需要等待结果,所以让新线程运行该方法,并在完成后,该线程将要求主线程更新结果(通过一些Callback或Handler),所有这些工作都是由Android AsyncTask

封装好