Sun*_*ike 3 android http android-asynctask
我正在尝试从DoInBackground中的asynctask返回值,但调用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);
}
Run Code Online (Sandbox Code Playgroud)
在我的活动中,我得到了结果 response = new GetUrlDataTask().execute("site").get;
Ale*_*kin 10
[更新]现在我建议使用注释.使用注释,您可以注入视图,只需几个字母就可以在编译步骤中将函数作为异步过程.查看github上的butterknife库.
您可以创建接口,将其传递给AsyncTask(在构造函数中),然后在onPostExecute中调用方法
例如:
你的界面:
public interface OnTaskCompleted{
void onTaskCompleted();
}
Run Code Online (Sandbox Code Playgroud)
你的活动:
public YourActivity implements OnTaskCompleted{
//your Activity
}
Run Code Online (Sandbox Code Playgroud)
而你的AsyncTask:
public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
private OnTaskCompleted listener;
public YourTask(OnTaskCompleted listener){
this.listener=listener;
}
//required methods
protected void onPostExecute(Object o){
//your stuff
listener.onTaskCompleted();
}
}
Run Code Online (Sandbox Code Playgroud)
如果异步任务需要花费任何相当长的时间(通常是这样),则不应使用.get().
相反,您可以使用消息/处理程序/服务/等,也可以只使用onPostExecute(Result)方法.
编辑:新代码.根据您的描述,您似乎需要使用界面.
如果你需要在另一个类中使用Asynctask,那么接口可能是你最好的选择.
TestTask.java(你单独的Asynctask):
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;
}
}
Run Code Online (Sandbox Code Playgroud)
MainActivity.java(或任何其他活动):
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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13924 次 |
最近记录: |