0

タスク ImageUploadTask() を完了すると、メソッド自体が sResponse を返し、これがおそらく onPostExecute() をトリガーします。ただし、 onPostExecute() を機能させることができません。

インテントのコードは次のとおりです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 upload.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            if (bitmap == null) {
                Toast.makeText(getApplicationContext(),
                        "Please select image", Toast.LENGTH_SHORT).show();
            } else if (subject.getText() == null) {
                Toast.makeText(getApplicationContext(),
                        "Please enter subject title", Toast.LENGTH_SHORT).show();
            } else if (msg == null) {
                Toast.makeText(getApplicationContext(),
                        "Please enter message", Toast.LENGTH_SHORT).show();
            } else {                
                dialog = ProgressDialog.show(MainActivity.this, "Uploading",
                        "Please wait...", true);
                new ImageUploadTask().execute();
            }
        }
    });

ImageUploadTask() は次のとおりです。

class ImageUploadTask extends AsyncTask <Void, Void, String>{
@Override
protected String doInBackground(Void... params) {
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost("http://203.117.178.181/test3/postdata2.php");

        MultipartEntity entity = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.JPEG, 100, bos);
        byte[] data = bos.toByteArray();
        entity.addPart("userfile", new ByteArrayBody(data,
                "myImage.jpg"));
        entity.addPart("subject", new StringBody(subject.getText()
                .toString()));
        entity.addPart("message", new StringBody(msg.getText()
                .toString()));
        httpPost.setEntity(entity);
        HttpResponse response = httpClient.execute(httpPost,
                localContext);
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                        response.getEntity().getContent(), "UTF-8"));

        String sResponse = reader.readLine();
        return sResponse;

    } catch (Exception e) {
        if (dialog.isShowing())
            dialog.dismiss();
        Toast.makeText(getApplicationContext(),
                getString(R.string.exception_message),
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
        return null;
    }
    // (null);
}  

onPostExecute() のコードは次のとおりです。

@Override
protected void onPostExecute(String sResponse) {
    super.onPostExecute(sResponse);
    try {
        if (dialog.isShowing())
            dialog.dismiss();

        if (sResponse != null) {
            JSONObject JResponse = new JSONObject(sResponse);
            int success = JResponse.getInt("SUCCESS");
            String message = JResponse.getString("MESSAGE");
            if (success == 0) {
                Toast.makeText(getApplicationContext(), message,
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getApplicationContext(),
                        "Photo uploaded successfully",
                        Toast.LENGTH_SHORT).show();
                subject.setText("");
                msg.setText("");
            }
        }
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.exception_message),
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }
}
}}

よろしくお願いします = D

4

4 に答える 4

2

これを次のように変更します。

@Override
protected void onPostExecute(String... sResponse) {

追加...

編集: また、@Raghunandan指摘したように、Toastから呼び出すことはできませんdoInBackground。これは単なるバックグラウンド スレッドであり、UI コマンドをサポートしていません。そのためには、 と を使用する必要がありpublishProgress()ますonProgressUpdate()

于 2013-09-02T12:22:46.703 に答える
0

例外が発生している可能性があります。

これは にありdoInbackgroundます。

 Toast.makeText(getApplicationContext(),
            getString(R.string.exception_message),
            Toast.LENGTH_LONG).show();

doInbackgroundバックグラウンド スレッドで呼び出されます。から toast/update ui を表示することはできませんdoInbackground。応答を返し、トーストを表示しますonPostExecute

これを変更する必要があります

     catch (Exception e) {
    if (dialog.isShowing())
        dialog.dismiss();
    Toast.makeText(getApplicationContext(),
            getString(R.string.exception_message),
            Toast.LENGTH_LONG).show();
    Log.e(e.getClass().getName(), e.getMessage(), e);
    return null;
}

     catch (Exception e) {
          e.printStacktrace();
      }

詳細については、トピックThe 4 steps の下のドキュメントを確認してください。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-09-02T12:31:28.220 に答える
0

おそらく doInBackGround メソッドが例外をスローしています。また、スーパーを削除することもできます。super.onPostExecute() は冗長であるため。

于 2013-09-02T13:24:19.807 に答える