【发布时间】:2015-04-05 05:52:02
【问题描述】:
我创建了一个名为 ConnectionHttp 的自定义 AsyncTask 类。当由主活动(test1.java)中的按钮调用时,它必须返回一个 Json 字符串。连接一切正常,我可以得到字符串。
关键是我想在后台任务运行时在主活动上显示一个 ProgressDialog,但它不起作用。我没有看到任何 ProgressDialog。
1) 如何修复progressDialog
2)我如何解决日志中的问题(应用程序可能做的工作太多......)(我正在真实设备上测试)
这是我的代码:
test1.java(主要活动)
公共类测试1 {
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(); } } }); }
ConnectionHttp.java
公共类 ConnectionHttp 扩展 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<NameValuePair> 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:开始
D/request #1:成功!
I/Choreographer﹕跳过了 49 帧!应用程序可能在其主线程上做了太多工作。
D/request #1:完成
【问题讨论】:
-
解决应用程序工作量太大的问题 Change String str = conn.execute().get();到字符串 str = conn.execute();并将上下文传递给 asynctask 类并在那里创建 ProgressDialog。
-
当我更改时它可以工作:
String str = conn.execute().get();到conn.execute();我在 AsyncTask 类中创建了 ProgressDialog。现在它可以工作了,但是我怎样才能在没有“conn.execute().get()”的情况下获得 Json 字符串?谢谢 -
您应该使用回调方法,该方法将在异步任务完成后调用,它将更新您的文本视图或使用广播接收器。
-
成功了,非常感谢你们!
标签: android android-asynctask progressdialog