2011-08-22 158 views
5

我有一个方法hostPhoto();它基本上将图像上传到网站并检索链接。 然后我有其他方法将链接发布到网站。Android如何在继续之前等待代码完成

现在使用这种方法的方式即时通讯”是这样的:

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(); 
+0

封装你应该张贴更多的代码,尤其是因为你描述的行为是非标准的,所以'hostPhoto()'的内容。 –

+0

'AsyncTask'不能解决这个问题,因为'hostPhoto()'甚至不会阻塞该线程。像提到的atc一样,你需要从'hostPhoto()'发布代码。 –

+0

hostPhoto的代码已更新 – asd2005

回答

8

可以使用的AsyncTask这里,

AsyncTask

使用,你可以在doInBackground执行的

hostPhoto()

()的代码,然后执行的

代码

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(); 
+0

嘿,谢谢你的回复。 执行你的方法后,我得到一个error.Check出hte更新的问题上面 – asd2005

+0

最后的作品!问题是hostPhoto()中的线程,有人能提供给我一个探索为什么这个线程会造成这种情况吗? – asd2005

2

我使用一个单独的线程异步地完成这个动作假设你是(或者应该是)。

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

一般我做这个用AsyncTask与Android ...

此为您提供的回调onPostExecute(),你可以做你的post()内。

0

你的第二个问题:

可能有人给我一个解释,为什么那个线程会有 引起这个?

您致电“link = photo.post(filepath);”这是在一个新的线程上运行。 虽然该方法仍在运行,但链接仍为空,并且当前线程(主线程)继续以该链接运行(当时为null)

在这种情况下,您需要等待结果让新线程运行的方法,并在完成后,该线程将要求主线程更新结果(通过一些回调或处理程序),所有这些工作都深受Android AsyncTask

相关问题