Android异步任务冻结用户界面
我正在尝试从服务器获取数据。尽管我用doinbackground方法连接和提取数据,但UI还是冻结了。如果有人能帮助我,我将不胜感激,因为我检查了关于这个主题的所有问题,但没有找到解决方案Android异步任务冻结用户界面,android,user-interface,android-asynctask,freeze,Android,User Interface,Android Asynctask,Freeze,我正在尝试从服务器获取数据。尽管我用doinbackground方法连接和提取数据,但UI还是冻结了。如果有人能帮助我,我将不胜感激,因为我检查了关于这个主题的所有问题,但没有找到解决方案 public class GetMessagesActivity extends AsyncTask<String, Void, String> { private Context context; private ProgressDialog progressDialog;
public class GetMessagesActivity extends AsyncTask<String, Void, String> {
private Context context;
private ProgressDialog progressDialog;
public GetMessagesActivity(Context context) {
this.context = context;
this.progressDialog = new ProgressDialog(context);
this.progressDialog.setCancelable(false);
this.progressDialog.setMessage("Updating...");
this.progressDialog.show();
}
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... arg0) {
try {
String pid = "1";
String link = "somelink";
String data = URLEncoder.encode("pid", "UTF-8") + "="
+ URLEncoder.encode(pid, "UTF-8");
// data += "&" + URLEncoder.encode("password", "UTF-8")
// + "=" + URLEncoder.encode(password, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(
conn.getOutputStream());
wr.write(data);
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while ((line = reader.readLine()) != null) {
sb.append(line);
break;
}
return sb.toString();
} catch (Exception e) {
return new String("Exception: " + e.getMessage());
}
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
if (this.progressDialog != null) {
this.progressDialog.dismiss();
}
}
}
公共类GetMessagesActivity扩展了异步任务{
私人语境;
私有进程对话;
公共GetMessagesActivity(上下文){
this.context=上下文;
this.progressDialog=新建progressDialog(上下文);
this.progressDialog.setCancelable(false);
这个.progressDialog.setMessage(“更新…”);
这个.progressDialog.show();
}
受保护的void onPreExecute(){
}
@凌驾
受保护的字符串doInBackground(字符串…arg0){
试一试{
字符串pid=“1”;
String link=“somelink”;
字符串数据=URLEncoder.encode(“pid”,“UTF-8”)+“=”
+编码(pid,“UTF-8”);
//数据+=“&”+URLCoder.encode(“密码”,“UTF-8”)
//+“=”+URLEncoder.encode(密码为“UTF-8”);
URL=新的URL(链接);
URLConnection conn=url.openConnection();
连接设置输出(真);
OutputStreamWriter wr=新的OutputStreamWriter(
conn.getOutputStream());
wr.写入(数据);
wr.flush();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
conn.getInputStream());
StringBuilder sb=新的StringBuilder();
字符串行=null;
//读取服务器响应
而((line=reader.readLine())!=null){
某人附加(行);
打破
}
使某人返回字符串();
}捕获(例外e){
返回新字符串(“异常:+e.getMessage());
}
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
}
@凌驾
受保护的void onPostExecute(字符串结果){
如果(this.progressDialog!=null){
此.progressDialog.discouse()文件;
}
}
}
您可能误用了异步任务。你应该这样称呼它:
new YourAsyncTask().execute();
如果您这样调用:“new YourAsyncTask().get()”,它将阻止UI线程
请参见此处的一些用法参考:
您可能误用了异步任务。你应该这样称呼它:
new YourAsyncTask().execute();
如果您这样调用:“new YourAsyncTask().get()”,它将阻止UI线程
请参见此处的一些用法参考:
您尚未展示如何执行任务。我想试试看,您正在使用
get()
来阻止调用线程。您是对的。我删除了get()并使用了execute(),它工作得非常好。非常感谢你,你还没有展示你是如何执行任务的。我想试试看,您正在使用get()
来阻止调用线程。您是对的。我删除了get()并使用了execute(),它工作得非常好。非常感谢你