3

httpGETメソッドを使用してアプリデータを取得しています。タスクが終了したら、mainActivityにreturn vlaueを表示したいと思います(現在、アプリには1つのアクティビティしかありません)

これは私のasyncTaskクラスです:

class getAsync extends AsyncTask<String,Void,String> {
    String ret;
    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }
}

そして私の主な活動から、私はそれを次のように使用します:

getAsync get = new getAsync();
get.execute(url);
statText.setText(get.ret);

ここで、statTextはアクティビティウィンドウのテキストです。logcatで応答の本文を見ることができるので、それは空白のままです。このデータを自分のアクティビティに適切に戻すにはどうすればよいですか?

4

4 に答える 4

3

Asynce タスクには onPostExecute メソッドがあります...このメソッドでは、UI コンポーネントで作業できるので、onPostExecute に settext があります...以下のコードを使用します..

class getAsync extends AsyncTask<String,Void,String> {

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        String ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }

   @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            statText.setText(result);

     }

}
于 2013-03-08T06:11:17.433 に答える
2

結果は から の メソッドに渡さdoInBag()onPostexecute()ますAsyncTask

これで、ハンドラーを使用して、次のようにデータをアクティビティに送り返すことができます。

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if (mProgressDialog != null) {
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
        }
        final Message message = new Message();
        if (result != null && !result.equals("")) {
            if (result.equals("success")) {
                message.what = 1000; // to show SUCCESS
            } else {
                message.what = 1001; // to show FAILURE
            }
        } else {
                message.what = 1001; // to show FAILURE
        }
        mHandler.sendMessage(message);
    }

編集: AsyncTask でのハンドラーの使用:

次のようにアクティビティでハンドラを宣言します。

    /**
         * Handler to update the UI.
         */
        private static final Handler sHandler = new Handler() {

    @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1000) {

                        } else {
                         // failure
                       } 
                     }
    };

アクティビティで、次のように AsyncTask を呼び出します。

YourAsyncTask obj = new YourAsyncTask(context, sHandler);
obj.execute();

AsyncTask で、次のようなコンストラクターを作成します。

public YourAsyncTask(final Context context, final Handler handler) {
this.context = context;
mHandler = handler;
}

説明:

ここでハンドラーを使用する必要があるのは、バックグラウンド操作が終了した後にアクティビティに戻って、AsyncTask の結果に基づいて他のタスクを実行する必要がある場合があるためです。ここで、ハンドラーの参照を asyncTask に渡し、最終的に結果をアクティビティに送り返します。

上記のハンドラーは静的ハンドラーであることに注意してください。そうしないと、非同期操作が完了する前にアクティビティが終了すると、メモリ リークが発生する可能性があります。

于 2013-03-08T06:09:16.203 に答える
0

結果をアクティビティに発行するためのコールバック インターフェイスを作成することをお勧めします。

public interface AsyncTaskCompleteListener {
    public void onTaskComplete(String result);
}

別のクラスでネットワーク操作を行う

public class RssFeedAsyncTask extends
        AsyncTask<String, Void, String> {
    private ProgressDialog Dialog;
    String response = "";
    Activity _context;
    private AsyncTaskCompletionListener callback;

    public RssFeedAsyncTask(Activity _context) {
        this._context = _context;
        this.callback = (AsyncTaskCompletionListener) _context;
    }

    @Override
    protected void onPreExecute() {
        Dialog = new ProgressDialog(_context);
        Dialog.setMessage("Loading...");
        Dialog.show();

    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            // Your Code
        } catch (Exception e) {
        }
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        Dialog.dismiss();
        callback.onTaskComplete(result);

    }

}

そして最後にあなたのアクティビティクラスとそのコールバックインターフェースを実装します

public class RssReaderActivity extends Activity implements AsyncTaskCompletionListener{



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if(Utility.determineConnectivity(this))
        new RssFeedAsyncTask(this).execute(Yoururl);
        else
            Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
    }



    @Override
    public void onTaskComplete(String result) {
    //write the code to upadte the UI from the Result
          statText.setText(result);
    }

}

これが、適切に構造化されたクリーンな個別のプログラミングを作成するのに役立つことを願っています。詳細については、以下のブログを参照してください

http://amitandroid.blogspot.in/2013/02/android-rssfeed-with-async-task-example.html

ありがとう、

于 2013-03-08T06:20:35.243 に答える
0

public String ret="";アクティビティ クラスに定義します。

以下の方法で設定します:

class getAsync extends AsyncTask<String,Void,String> {

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        myGetReq myget = new myGetReq();
        ret = myget.get(url);
        Log.d("[RETURN STATUS]",ret);
        return ret;
    }
}

以下の方法で簡単に取得します。

statText.setText(ret);
于 2013-03-08T06:11:14.973 に答える