如何从onProgressUpdate和onPostExecute获得响应

时间:2014-02-28 06:28:55

标签: java android android-asynctask

我有一个活动和一个asynctask。我希望异步任务中的进度结果到活动文本视图和活动文本视图中的最终结果。我最后指出了如何从onProgressUpdate()onPostExecute()发送结果。帮助我解决这个问题

MainActivity.java

public class MainActivity extends Activity {

TextView tv;
Button b1;
AsyncTask<Integer, Integer, Integer> ta;
private static String TAG = "MainActivity";

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

    tv = (TextView) findViewById(R.id.viewer);
    b1 = (Button) findViewById(R.id.clicker);

    tv.setText("2");
    b1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            int val = Integer.parseInt(tv.getText().toString());
            ta = new TestAsync(getApplicationContext()).execute(val);
        }
    }); 
}

public void callOnEnd() {
    try {
        Log.d(TAG, "TestAsync " + ta.get() + " status " + ta.getStatus());
    } catch(Exception e) {
        Log.d(TAG, "TestAsync Exception " + e.toString());
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

TestAsync.java

public class TestAsync extends AsyncTask<Integer, Integer, Integer>{

Context context;
private static String TAG = "TestAsync";
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");

public TestAsync(Context ctx) {
    this.context = ctx;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    Log.d(TAG, TAG + "Reached AsyncTask");
}

@Override
protected Integer doInBackground(Integer... params) {
    Log.d(TAG, TAG + "doInBackground");
    int val = params[0], i, res;

    for(i=0; i<100; i++) {
        res = i * val;
        publishProgress(res);
    }
    return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    Log.d(TAG, TAG + " onProgressUpdate " + values[0]);

}

@Override
protected void onPostExecute(Integer result) {
    super.onPostExecute(result);
    Log.d(TAG, TAG + "onPostExecute " + result);

}
}

2 个答案:

答案 0 :(得分:3)

有两种可能性:

  1. AsyncTask实现为内部类:
    您可以在MainActivity.thisonProgressUpdate()内访问onPostUpdate()。你可以打电话给这样的事。

    @Override
    protected void onPostExecute(Integer result) {
        MainActivity.this.tv.setText("my result is: " + result);
    }
    
  2. 您可以在MainActivity中创建某种类型的界面,然后传递给AsyncTask,以便在这些方法中调用它。

    public class MainActivity extends Activity {
    
        // all your code
    
        public void onResult(Integer result) {
            tv.setText("my result is: " + result);
        }
    }
    

    在您的AsyncTask

    @Override
    protected void onPostExecute(Integer result) {
        ((MainActivity) context).onResult(result);
    }
    

    您需要使用TestAsync()而不是MainActivity.this创建getApplicationContext()。否则,演员阵容将失败。

    合适的interface会更好,但你明白了。

答案 1 :(得分:0)

您在onProgressUpdate和onPostUpdate中所做的一切都将直接发布到UIThread。只需在这两个函数中编写逻辑,就可以在这两个函数中访问UI线程的任何组件。