2016-03-20 58 views
1

因此,我是新来的,我需要调用将从单独的文件运行AsyncTask的函数。如何在AsyncTask doInBackground不运行,但在第二次它运行

MainActivity.java代码

public class MainActivity extends AppCompatActivity { 
String res; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Asynctasktest newAsy = new Asynctasktest(); 



    res = newAsy.ValidateUser(); 

    Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 
} 

} 

和AsyncTaskTest.java代码

public class Asynctasktest extends MainActivity { 

String Res; 

private class GetFWork extends AsyncTask<Void,Void,String> { 

    @Override 
    protected void onPreExecute() { 
     Res = "onPreExecute"; 
    } 

    @Override 
    protected String doInBackground(Void... param) { 

     return "am i here"; 
    } 

    @Override 
    protected void onPostExecute(String Result) { 
     super.onPostExecute(Result); 
     Res = Result; 
    } 
} 

public String ValidateUser(){ 

    final GetFWork Fl = new GetFWork(); 

    Fl.execute(); 

    return Res; 
} 


} 

所以我需要得到文本 “我在这里”,但我得到 “onPreExecute”,这表明上首先称它不做doInBackground。

+0

这是一个非常原始的方式来跟踪你的应用程序发生的事情。使用'Log'或简单地用断点调试。 – Vucko

+0

第一个电话应该打到doInBackground(..)'。在'doInBackground(..)'的开头添加'android.os.Debug.waitForDebugger();'放置一个断点,看它是否到达该函数。 –

+0

AsyncTask的全部目的是它是“异步”的。你不能执行()它,并期望在下一行代码中有结果。 – Egor

回答

1

这是AsyncTask的工作原理。

res = newAsy.ValidateUser(); 
Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 

在同一时间都执行,因而 - 自的AsyncTask是异步 - RE的值仍然是“onPreExecute”。

0

Wukash提出的优点。只是为了阐述。当ValidateUser()返回Res时,不能保证AsyncTask已完成运行,因为它是异步的并且运行在主线程之外。因此,在你的情况下,它返回null,因为Res从未得到更新。

如果您需要返回值result以更新UI或其他内容,请发送处理函数引用作为回调,并使其工作。

请让我知道你是否需要一些进一步的解释。我记得当我第一次实施AysncTask时有过类似的问题。

+0

有大量资源可用于设置回调。 [这是我遵循的一个很好的](http://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui)。 –

+0

我使用了这个例子,并让它在我的测试中工作。所以我需要使用Asynctask对php进行不同的调用,我将不得不通过一些参数,然后像在OnPreExecute中构建链接,并在doInBackground上执行httpurlconnection调用并等待答案。或者有更好的办法呢? –

+0

@IvarsAkmentins我认为你在那里很不错。可能还会将链接建立到doInBackground,因为您并不需要它同步发生。一个体面的面向对象方法可以是实例化一个Asynctasktest对象,初始化一些你需要的链接构建参数,并将所有东西卸载到doInBackground。这将导致一个非常坚实的设计。 –

0

尝试调用超在这种方法

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

还请记住,你不能调用相同的AsyncTask对象两次,否则你会得到这个错误:

Cannot execute task: the task has already been executed (a task can be executed only once) 

所以你有办法你的ValidateUser()方法创建一个新的GetFWork()是很好的。

相关问题