My Androidアプリは私のウェブサイトに接続して情報を取得およびアップロードするため、AsyncTaskスレッドを使用します。
ある例では、メインスレッドにtrueまたはfalseの値を返すスレッドが必要です。
AsyncTask実行関数からこの戻り値を取得する方法はありますか?
次のことを行う場合:
Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();
私はただちんぷんかんぷんを取得します。
必要なのは、2番目のスレッドが完了するまでメインスレッドを一時停止する手段だと思います。2番目のスレッドはメインスレッドの関数を呼び出して戻り値を設定します。2番目のスレッドが完了すると、メインスレッドは一時停止を解除し、2番目のスレッドで設定された戻り値にアクセスしますこのロジックが適切な場合は、提案を提供してください...ありがとう!
これにはAsyncTask get() メソッドを使用できます。計算が完了するまで必要に応じて待機し、結果を取得します。
Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();
ただし、メインスレッドを長時間ブロックしないでください。UIが応答しなくなり、 [〜#〜] anr [〜#〜] になります。
[〜#〜] update [〜#〜]
非同期webのダウンロード/アップロードに関する質問のポイントを見逃しました。 Web /ネットワーク操作は長いものと見なされる必要があるため、アプローチ「UIスレッドを一時停止してダウンロードが完了するまで待機する」は常に間違っています。代わりに通常の結果公開アプローチを使用します(例:AsyncTask.onPostExecute
、Service + sendBroadcast、Volley、RoboSpice、DataDroidなどのライブラリ)。
ハンドラーは、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;
}
};
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;
}
}
} //クラスの終わり
非同期タスクから値を返す問題の完全な例を次に示します。非同期に次々に実行される多くのタスクが発生する場合があります。
基本。 1.クラスから戻り値を取得します。
public class Snippet {
int computVal;
public Snippet(){
computVal = 17*32;
}
public int getVal(){
return computVal;
}
}
これは...と呼ばれます.
int hooray = (new Snippet()).getVal();