我的Android应用程序连接到我的网站以检索和上传信息,因此我使用AsyncTask线程。
在一个实例中,我需要我的线程将true或false值返回给我的主线程。
有没有办法从AsyncTask执行函数中获取此返回值?
当我执行以下操作时:
Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();
我得到了很多胡言乱语。
我认为我需要的是暂停主线程直到第二个线程完成的方法。第二个线程调用主线程中的函数来设置我的返回值。 因此,当第二个线程完成时,主线程可以取消暂停并访问第二个线程设置的返回值 如果这个逻辑是合理的,请提供建议......谢谢!
答案 0 :(得分:40)
您可以使用AsyncTask get()方法。它等待计算完成所需,然后检索其结果:
Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();
但请务必不要长时间阻止主线程,因为这会导致无法响应的用户界面和ANR。
<强>更新强>
我错过了关于异步 web 下载/上传的问题。网络/网络操作应该被视为一个长的,因此“暂停UI线程并等到下载完成”的方法总是错误的。使用通常的结果发布方法(例如:AsyncTask.onPostExecute
,Service + sendBroadcast,Volley,RoboSpice,DataDroid等库。)
答案 1 :(得分:4)
处理程序是执行此操作的最佳方式
在onPostExcecute()
方法中只需执行
@Override
protected void onPostExecute(Boolean bool) {
super.onPostExecute(bool);
Message msg=new Message();
msg.obj=bool;
mHandler.sendMessage(msg);
}
}
并且您的消息处理程序将是
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
bool i=(String)msg.obj;
}
};
答案 2 :(得分:1)
public class RunWebScript {
String mString;
public RunWebScript(String url){
try {
URL updateURL = new URL(url);
URLConnection conn = updateURL.openConnection();
// now read the items returned...
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while((current = bis.read()) != -1){
baf.append((byte)current);
}
String s = new String(baf.toByteArray());
mString = s;
} catch (Exception e) {
Log.e("ANDRO_ASYNC", "exception in callWebPage",e);
mString = "error";
}
}
public String getVal(){
return mString;
}
}
这被执行为......(显示调用类
的方法的结尾) asyncWebCall (url1,CONSTANT);
}
private void asyncWebCall(String url,int actionPostExecute){
new WebCall().execute(url,String.format("%d",actionPostExecute));
}
业务的异步部分是......注意onPostExecute中的case语句,这是将返回值重新获得程序的关键。注意调用new WebCall()。execute(url,String.format(“%d”,actionPostExecute));是一个线程做的最后一件事,没有进一步的语句可以执行,控制通过onPostExecute返回。
class WebCall extends AsyncTask<String, String, String>{
int chooser = -1;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
try {
chooser = Integer.parseInt(params[1]);
} catch(NumberFormatException nfe) {
Log.d("ANDRO_ASYNC",String.format("asyncReturn() mString numberformatexception = %s",params[1]));
chooser = 0;
}
return(new RunWebScript(params[0])).getVal();
}
protected void onProgressUpdate(String... progress) {
}
@Override
protected void onPostExecute(String gotFromDoInBkgnd) {
Log.d("ANDRO_ASYNC",String.format("chooser = %s",chooser));
switch (chooser){
case CONSTANT:
printStringx(gotFromDoInBkgnd);
asyncWebCall(url2,5);
break;
case 0:
Log.d("ANDRO_ASYNC",String.format("case 0 = %s",gotFromDoInBkgnd));
break;
case 5:
Log.d("ANDRO_ASYNC",String.format("case 5 = %s",gotFromDoInBkgnd));
asyncWebCall(url3,7);
break;
default:
Log.d("ANDRO_ASYNC",String.format("man we got problems = %s",gotFromDoInBkgnd));
break;
}
}
} //班级的结尾
答案 3 :(得分:0)
以下是从异步任务返回值的问题的完整示例。可能会发生许多任务要异步完成。
基本。 1.从类中获取返回值。
public class Snippet {
int computVal;
public Snippet(){
computVal = 17*32;
}
public int getVal(){
return computVal;
}
}
这称为......
int hooray = (new Snippet()).getVal();