1

通常、postExecute メソッドで UI を更新します。
例えば

public class SampleActivity extends Activity{
TextView textSample;
@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.aadd_addtocheck);
        textSample = (TextView) findViewById(R.id.lin);
                STask sampleTask = new Stask();
                sampleTask.execute();
}
class GetAdd extends AsyncTask<Void, Void, JSONObject> {


        @Override
        protected JSONObject doInBackground(Integer... params) {
            // TODO Auto-generated method stub
            UserFunctions u = new UserFunctions();
            return u.getNewAdd();
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            super.onPostExecute(result);
                    textSample.setText(result.getString("Something");
}

ただし、私の asyncTask が大きくなり、別のクラスに移動したい (サブクラスになる前に)。そのため、asynctask が別のクラスになるときに、UI を更新する方法 (texview の設定など) を考えています。

4

3 に答える 3

2

ContextActivity、または個々Viewの をのコンストラクターに渡しAsyncTask、それらをメンバー変数として格納してから、 で更新しますonPostExecute()

メモリ リークを防ぐために、ContextまたはActivityWeakReferenceとして保存してください。

于 2013-10-23T18:11:33.857 に答える
1

AsyncTask を別のファイルに入れる場合は、AsyncTask他のアクティビティからそれを再利用する可能性が高いため、ベスト プラクティスは、アクティビティへのコールバックを作成して、すべての UI 処理を行うことだと思います。

それを行うには、次のようなインターフェイスを作成する必要があります。

public interface OnGetAddCompletedListener {
    public void onGetAddCompleted(String text);
}

あなたのコンストラクターでコールバックを受け取り、その中AsyncTaskのメソッドを呼び出しますonPostExecute

public class GetAdd extends AsyncTask<Void, Void, JSONObject> {

    private OnGetAddCompletedListener callback;

    public GetAdd(OnGetAddCompletedListener callback) {
        this.callback = callback;
    }

    @Override
    protected JSONObject doInBackground(Integer... params) {
        // TODO Auto-generated method stub
        UserFunctions u = new UserFunctions();
        return u.getNewAdd();
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        callback.onGetAddCompleted(result.getString("Something");
    }
}

次に、実行中のインターフェイスを実装してActivity、でデータを取得したときに UI の変更を処理するようにしますAsycTask

public class SampleActivity extends Activity implements OnGetAddCompletedListener {
    TextView textSample;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.aadd_addtocheck);
        textSample = (TextView) findViewById(R.id.lin);
                STask sampleTask = new Stask();
                sampleTask.execute();
    }

    public void onGetAddCompleted(String text) {
        textSample.setText(text);
    }
}

このアプローチでは、その AsyncTask を他のアクティビティから再利用することにしAsyncTaskた場合、必要に応じて終了したときに別のことを行うことができます。

于 2013-10-23T19:11:08.707 に答える
0

AsyncTask を呼び出すときに、そのコンストラクターに引数を渡すことができます。あなたの主な活動に次のようなものがあるとしましょう:

TextView tv = (TextView) findViewById(R.id.my_text_view);
Stask sampleTask = new Stask(tv);
sampleTask.execute();

AsyncTask を作成しているときは、次のものがあります。

class Stask extends AsyncTask ...(){
    final TextView textView; 

    public Stask(Textview inputFromOtherClass){
        this.textView = inputFromOtherClass;
    }
}

このようにして、メイン アクティビティで作成された TextView は、AsyncTask のインスタンスとして存在できます。

編集:他の誰かが投稿したように、コンテキストに対して同様のことができます。これは、さまざまなインスタンスを作成するのに役立ちます。

于 2013-10-23T18:30:08.443 に答える