0

クラスを実装してextends AsyncTaskおり、このクラス内で http リクエストを実行します。Activityこのクラスを数回使用したいので、クラスは別の Java ファイルにありません。

Activity別のスレッドで http 要求を実行するために、my でこのクラスのオブジェクトをインスタンス化します。スレッドが実行されたら、 my のメソッドを呼び出したいと思いActivityます。

これを実装するにはどうすればよいですか?http リクエストの結果が必要ですが、Activityこれまでのところ処理できません。

これはスレッドタスクのコードです...

public class PostRequest extends AsyncTask<String, Void, String> {
public String result = "";

@Override
protected String doInBackground(String... urls) {
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://bla/index.php?" + urls[0]);
        // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();

        // convert response to string
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}

@Override
protected void onPostExecute(String result) {

}
}

そして、これはActivityスレッドクラスを作成する私のコードの一部です...

public class ListActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);


    PostRequest task = new PostRequest();
    task.execute(new String[] { "action=getUsers" });
    task.onPostExecute(task.result) {

    }
}

public void Display(String result) {
    try {
        JSONArray jArray = new JSONArray(result);
        JSONObject json_data = jArray.getJSONObject(0);
        String value = json_data.getString("name");
        TextView text = (TextView) findViewById(R.id.value);
        text.setText(value);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
}
4

3 に答える 3

1

コンストラクターでアクティビティ参照を渡します......

なので

public class PostRequest extends AsyncTask<String, Void, String> {
public String result = "";
private Activity mActivity;

 public PostRequest(Activity activity){
          super();
         mActivity = activity;
}

......
于 2012-06-05T18:24:59.540 に答える
0

この質問を参照してください... can-i-put-asynctask-in-a-separate-class-and-have-a-callbackと受け入れられた回答。AysncTaskスタンドアロン クラスとして再利用可能にしたい場合は、リスナーをすべてのアクティビティのコールバックとして使用するのが最善の方法です。

于 2012-06-05T18:35:47.943 に答える
0

onPostExecute()これはプロセスが完了した後に呼び出されるため、実行する必要はありません。doInBackgroundその後、AsyncTask のコンストラクターに渡されたアクティビティの参照を使用して、UI でいつでもメソッドを実行できます。

onPostExecute()メソッドは UI スレッドで実行されるので、必要に応じてこのメソッドからビューを変更できることを覚えておいてください。

于 2012-06-05T18:25:21.477 に答える