我创建了一个名为ConnectionHttp的自定义AsyncTask类。 当通过主活动(test1.java)中的按钮调用时,它们必须返回Json字符串。 连接一切正常,我可以得到字符串。
关键是我想在后台任务运行时在主活动上显示一个ProgressDialog,但它不起作用。 我没有看到任何ProgressDialog。
1)我该如何修复progressDialog
2)我该如何解决日志中的问题(应用程序可能做了太多工作...)(我正在真实设备上进行测试)
这是我的代码:
test1.java(主要活动)
public class test1 {
public static final String URL =".....";
private ProgressDialog pDialog;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test1);
pDialog = new ProgressDialog(test1.this);
tv = (TextView)findViewById(R.id.tvTest);
Button btRun = (Button) findViewById(R.id.btTestRun);
btRun.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
ConnectionHttp conn = new ConnectionHttp(test1.this, pDialog, URL);
String str = conn.execute().get();
tv.setText(str);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
});
}
连接Http.java
public class ConnectionHttp extends AsyncTask
{
private ProgressDialog pDialog;
private Context context;
private String LOGIN_URL;
private JSONParser jsonParser;
// TAGS
private final String TAG_SUCCESS ="success";
private final String TAG_MESSAGE ="message";
private final String TAG_VALUES ="values";
public ConnectionHttp(Context context, ProgressDialog pDialog, String url) {
this.context = context;
this.pDialog = pDialog;
this.LOGIN_URL = url;
this.jsonParser = new JSONParser();
}
@Override
public void onPreExecute() {
super.onPreExecute();
pDialog.setMessage("Connexion au serveur distant...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
public String doInBackground(String... args) {
// TODO Auto-generated method stub
int success;
String values ="";
try {
List params = new ArrayList<>();
// adding parameters
// ...
params.add(.....);
//
Log.d("request #1","starting");
JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL,"POST", params);
// success tag for json
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.d("request #1","Successfull");
values = json.getString(TAG_VALUES);
return json.getString(TAG_MESSAGE);
}else{
return json.getString(TAG_MESSAGE);
}
} catch (JSONException e) {
e.printStackTrace();
}
return values;
}
public void onPostExecute(String message) {
Log.d("request #1","done.");
pDialog.setMessage("done.");
pDialog.dismiss();
}
Android日志
D/request #1﹕ starting
D/request #1 : Successfull !
I/Choreographer﹕ Skipped 49 frames! The application may be doing too much work on its main thread.
D/request #1﹕ done
解决应用程序可能做过多工作的问题更改String str = conn.execute()。get(); 到字符串str = conn.execute(); 并将上下文传递给asynctask类并在其中创建ProgressDialog。
当我将String str = conn.execute().get();更改为conn.execute();时,它可以工作。我在AsyncTask类中创建了ProgressDialog。 现在它可以工作了,但是我如何才能得到Json String而不是" conn.execute()。get()"? 谢谢
您应该使用回调方法,该方法将在异步任务完成后调用,它将更新您的文本视图或使用广播接收器。
它的工作原理,非常感谢你们!
不要将进度对话框传递给Async类。 而是在Async类上创建它。
修改onPreExecute对此
@Override
public void onPreExecute() {
super.onPreExecute();
pdialog = new ProgressDialog(getActivity(),"","Connexion au serveur distant...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
从test1.java删除进度对话框
乐意效劳! :)
首先从AsyncTask中删除进度对话框,然后使用传递的上下文创建ProgressDialog;
public ConnectionHttp(Context context, ProgressDialog pDialog, String url) {
this.context = context;
this.pDialog = new ProgressDialog(context);
this.LOGIN_URL = url;
this.jsonParser = new JSONParser();
}