2

写真がアップロードされているときにプログレスバーが表示されない理由を誰かに教えてもらえますか?asynctask構造を、それが機能する古いプロジェクトからコピーしました。私の古いプロジェクトでは、asynctaskを使用してWebサーバーから画像をダウンロードし、ダウンロード中にプログレスバーを表示します。これが私のコードです:

public class PreviewPostActivity extends Activity {

ImageView imageView;

TextView tvComment;
Button submit;
MyLocationListener locationListener;
List<NameValuePair> list = new ArrayList<NameValuePair>();
private final String url = "***"; //Url of php script
ProgressDialog pDialog;
String responseMessage="";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.preview_post);

    Intent intent = this.getIntent();
    imageView = (ImageView)findViewById(R.id.imgPerview);
    tvComment = (TextView)findViewById(R.id.txtPreviewComment);
    submit = (Button)findViewById(R.id.btnPreviewSubmit);

    Bitmap image = (Bitmap)intent.getParcelableExtra("picture");
    String comment = intent.getStringExtra("comment");
    locationListener = (MyLocationListener)intent.getSerializableExtra("location");
    String imagePath = intent.getStringExtra("imagePath");
    String date = intent.getStringExtra("date");

    imageView.setImageBitmap(image);
    tvComment.setText(comment);

    //tvComment.append("\n"+locationListener.latitude + "\n"+locationListener.longitude);

    list.add(new BasicNameValuePair("image", imagePath));
    list.add(new BasicNameValuePair("comment", comment));
    list.add(new BasicNameValuePair("longitude", Double.toString(locationListener.longitude)));
    list.add(new BasicNameValuePair("latitude", Double.toString(locationListener.latitude)));
    list.add(new BasicNameValuePair("date", date));

    submit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            new uploadPost().execute();

        }
    });

}

public void post(List<NameValuePair> nameValuePairs) {
    HttpParams httpParameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
    HttpConnectionParams.setSoTimeout(httpParameters, 200000);
    HttpClient httpClient = new DefaultHttpClient(httpParameters);
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(url);

    try {
        MultipartEntity entity = new MultipartEntity();

        for(int index=0; index < nameValuePairs.size(); index++) {
            if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) {
                // If the key equals to "image", we use FileBody to transfer the data

                entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File(nameValuePairs.get(index).getValue()),"image/jpeg"));
            } else {
                // Normal string data
                entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue()));
            }
        }

        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost, localContext);
        HttpEntity httpEntity = response.getEntity();
        String responseMessage = EntityUtils.toString(httpEntity);

        tvComment.setText(responseMessage);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class uploadPost extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(PreviewPostActivity.this);
        pDialog.setMessage("Uploading post. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {

                    //post(list);
                HttpParams httpParameters = new BasicHttpParams();
                HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
                HttpConnectionParams.setSoTimeout(httpParameters, 200000);
                HttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpContext localContext = new BasicHttpContext();
                HttpPost httpPost = new HttpPost(url);

                try {
                    MultipartEntity entity = new MultipartEntity();

                    for(int index=0; index < list.size(); index++) {
                        if(list.get(index).getName().equalsIgnoreCase("image")) {
                            // If the key equals to "image", we use FileBody to transfer the data

                            entity.addPart(list.get(index).getName(), new FileBody(new File(list.get(index).getValue()),"image/jpeg"));
                        } else {
                            // Normal string data
                            entity.addPart(list.get(index).getName(), new StringBody(list.get(index).getValue()));
                        }
                    }

                    httpPost.setEntity(entity);

                    HttpResponse response = httpClient.execute(httpPost, localContext);
                    HttpEntity httpEntity = response.getEntity();
                    responseMessage = EntityUtils.toString(httpEntity);

                    //tvComment.setText(responseMessage);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        tvComment.setText(responseMessage);
        pDialog.dismiss();
    }
}

したがって、アップロードのためにボタンを押すと、画面がフリーズし、アップロードが完了するまでフリーズしたままになり、プログレスバーがまったく表示されません。時々それは表示されますが、そのrlyリアと私は理由がわかりません。コード全体を挿入したdoInBackground本体のクラスからPost()メソッドを呼び出してみましたが(本体のコードはpost()メソッドと同じです)、効果は同じなので、プログレスバーを作成する際に何もしなかったと思います。しかし、もう一度、私は魔女の古いプロジェクトから非同期タスクコード全体をコピーしたと言います。それはうまくいきました。

編集:

PreviewPostActivity.classのコンストラクターでプログレスバーを作成しようとしましたが、その後、asynctaskクラスのコンストラクターを作成しましたが、それでも機能しません。それが私の古いプログラムで機能したので、私は非常に混乱しています。これが彼からのコードです:

class GetSlike extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(KlubSlikeActivity.this);
        pDialog.setMessage("Ucitavanje u toku. Molimo vas sacekajte...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {

                    String id = Integer.toString(k.getId());
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("klub",id));

                    slikeUrl = JSONAdapter.getSlike(params);
                    gv.setAdapter(new SlikeAdapter(slikeUrl,KlubSlikeActivity.this));
            }
        });

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
}

変更されたのはdoInBackground本体だけです...

編集:

実行後、ダイアログが表示runOnUiThread()されます。

4

2 に答える 2

6

ProgressBarこのライブラリは、アップロードタスクを実行するのに最適であり、 :の値を設定するために使用できる進行状況ハンドラーも提供することがわかりました。

https://github.com/nadam/android-async-http

次のように使用できます...アップロードボタンにonClickHandlerを設定します。

@Override
public void onClick(View arg0) {
    try {
        String url = Uri.parse("YOUR UPLOAD URL GOES HERE")
                .buildUpon()
                .appendQueryParameter("SOME PARAMETER IF NEEDED 01", "VALUE 01")
                .appendQueryParameter("SOME PARAMETER IF NEEDED 02", "VALUE 02")
                .build().toString();

        AsyncHttpResponseHandler httpResponseHandler = createHTTPResponseHandler();

        RequestParams params = new RequestParams();
        // this path could be retrieved from library or camera
        String imageFilePath = "/storage/sdcard/DCIM/Camera/IMG.jpg";
        params.put("data", new File(imageFilePath));

        AsyncHttpClient client = new AsyncHttpClient();
        client.post(url, params, httpResponseHandler);
    } catch (IOException e) {
        e.printStackTrace();                
    }
}

次に、このメソッドをアクティビティコードに追加します。

public AsyncHttpResponseHandler createHTTPResponseHandler() {
    AsyncHttpResponseHandler handler = new AsyncHttpResponseHandler() {
        @Override
        public void onStart() {
            super.onStart();
        }

        @Override
        public void onProgress(int position, int length) {
            super.onProgress(position, length);

            progressBar.setProgress(position);
            progressBar.setMax(length);
        }

        @Override
        public void onSuccess(String content) {
            super.onSuccess(content);
        }

        @Override
        public void onFailure(Throwable error, String content) {
            super.onFailure(error, content);
        }

        @Override
        public void onFinish() {
            super.onFinish();
        }
    };

    return handler;
}
于 2013-10-10T12:26:11.310 に答える
4

asynctask doinbackground()のUIスレッドでの実行が正しくありません。また、doInBackground()でnullを返し、onPostExecute()にパラメーターfile_urlがあります。doInbackground()の戻り値はonPostExecute()の値を受け取ります。

doInBackGround()はバックグラウンドで実行されるため、ここでUIにアクセスしたり更新したりすることはできません。

uiを更新するには、onPostExecute()を使用できます。

AsyncTaskは次のようになります。あなたはそれを間違った方法でやっています。

http://developer.android.com/reference/android/os/AsyncTask.html4つのステップのトピックを参照してください

 pd= new ProgressDialog(this);
 pd.setTitle("Posting data");
 new PostTask().execute();

private class PostTask extends AsyncTask<VOid, Void, Void> {

protected void onPreExecute()
{//display dialog.
  pd.show();
}
protected SoapObject doInBackground(Void... params) {
// TODO Auto-generated method stub
       //post request. do not update ui here. runs in background
return null;
}

protected void onPostExecute(Void param)
{   

 pd.dismiss();
 //update ui here
}
于 2013-03-22T14:40:07.903 に答える