我试图从 DoInBackground 中的异步任务返回值,但调用 get() 方法卡住了我的 UI。如何将代码重写为回调方法? :
public class GetUrlDataTask extends AsyncTask<String, Integer, String> {
String response;
HttpUtils util;
@Override
protected String doInBackground(String... params) {
try {
util = new HttpUtils(params[0]);
response = util.getContent();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
在我的 Activity 中,我得到的结果是 response = new GetUrlDataTask().execute("site").get;
最佳答案
如果异步任务要花费相当长的时间(通常是这样),则不应使用 .get()。
相反,您可以使用消息/处理程序/服务/等,或者您可以简单地使用 onPostExecute(Result) 方法。
编辑:新代码。根据您的描述,您似乎需要使用一个接口(interface)。
如果您需要在另一个类中使用 Asynctask,那么接口(interface)可能是您的最佳选择。
TestTask.java(您的独立异步任务):
import android.os.AsyncTask;
// Remember to change object type <> to what you need
public class TestTask extends AsyncTask<Object,Object,Object> {
public interface OnTaskCompleted{
void onTaskCompleted();
}
private OnTaskCompleted listener;
public TestTask(OnTaskCompleted listener){
this.listener = listener;
}
protected void onPostExecute(Object o){
// Call the interface method
if (listener != null)
listener.onTaskCompleted();
}
@Override
protected Object doInBackground(Object... params) {
// The sleep() is just to simulate activity and delay
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
MainActivity.java(或任何其他 Activity ):
public class MainActivity extends Activity {
private boolean status = false;
private OnTaskCompleted listener = new OnTaskCompleted() {
public void onTaskCompleted() {
status = true;
Toast.makeText(MainActivity.this, "Status: " + status, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(MainActivity.this, "Status: " + status, Toast.LENGTH_SHORT).show();
new TestTask(listener).execute("Testing");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
关于android - 不使用 get() 方法从 AsyncTask 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520188/