【问题标题】:Android how to wait for code to finish before continuingAndroid如何在继续之前等待代码完成
【发布时间】:2011-11-01 06:30:15
【问题描述】:

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

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

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

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

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

无论如何我可以让它先获得链接......然后发布? 像某种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();

【问题讨论】:

  • 您应该发布更多代码,尤其是hostPhoto() 的内容,因为您描述的行为是非标准的。
  • AsyncTask 不能解决这个问题,因为hostPhoto() 甚至不会阻塞线程。就像提到的 atc 一样,您需要从hostPhoto() 发布代码。
  • hostPhoto代码已更新
  • 更新 2:终于成功了!问题是hostPhoto()中的线程,有人可以解释为什么该线程会导致这种情况吗?感谢所有回复的人。
  • 既然 AsyncTask 已被弃用,我们现在应该使用什么?

标签: java android hyperlink android-asynctask


【解决方案1】:

关于你的第二个问题:

有人可以解释一下为什么该线程会有 导致这个?

你调用 "link= photo.post(filepath);"它在一个新线程上运行。 当该方法仍在运行时,链接仍然为空,并且您当前的线程(主线程)继续使用该链接运行(当时为空)

在这种情况下你需要等待结果,所以让新线程运行方法,完成后,该线程会要求主线程更新结果(通过一些回调或处理程序),所有这些工作都是被Android AsyncTask很好封装

【讨论】:

    【解决方案2】:

    你可以在这里使用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();
    

    【讨论】:

    • 您好,谢谢您的回复。执行您的方法后,我遇到错误。查看上面的更新问题
    • 终于成功了!问题是 hostPhoto() 中的线程,有人可以解释一下为什么该线程会导致这种情况吗?
    【解决方案3】:

    您可能需要查看callback pattern in Java

    【讨论】:

      【解决方案4】:

      你可以使用AsyncTask,参考this

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

      【讨论】:

        【解决方案5】:

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

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

        一般情况下,我在 Android 上使用 AsyncTask 完成此操作...

        这为你提供了回调onPostExecute(),你可以在里面做你的post()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          • 2020-02-24
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          • 2010-09-05
          • 1970-01-01
          相关资源
          最近更新 更多