【问题标题】:Android - Can't update the activity ProgressDialog from custom AsyncTask classAndroid - 无法从自定义 AsyncTask 类更新活动 ProgressDialog
【发布时间】: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


【解决方案1】:

不要将进度对话框传递给 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 中删除进度对话框

【讨论】:

    【解决方案2】:

    首先从 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多