2013-09-02 2 views
0

После выполнения задачи ImageUploadTask() сам метод вернет sResponse, который предположительно вызовет onPostExecute(). Тем не менее, я не могу заставить onPostExecute() работать.onPostExecute не выполняет

Код для Intent является:

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

+0

получение каких-либо ошибок plz paste logcat здесь –

+0

Benflop pls отправляет трассировку стека. вы, вероятно, получаете исключение – Raghunandan

+0

@Raghunandan, но я не получаю никаких исключений ... ImageUploadTask() был завершен без каких-либо исключений, но он все еще не выполнялся onPostExecute..i последовали за вашим советом. Я набрал следующий код: catch (исключение e) { \t e.printStackTrace(); return null; } – Benflop

ответ

1

Cha Нге его к этому:

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

Добавить ...

Edit: также как @Raghunandan точки, вы не можете позвонить Toast из вашего doInBackground, это просто фоновый поток и не поддерживает команды пользовательского интерфейса. Для этого вы должны использовать publishProgress() и onProgressUpdate().

+0

, почему этот '(String ... sResponse)'? когда op имеет 'String sResponse = reader.readLine(); return sResponse' – Raghunandan

+0

Я не уверен, что роль «...» играет. Обычно для меня это исправляет :) Я ищу объяснение. Если я найду его, я добавлю его к своему ответу :) – KickAss

+0

это не ответ на поставленный вопрос. его varargs http://stackoverflow.com/questions/766559/when-do-you-use-varargs-in-java – Raghunandan

0

Попробуйте это ..

@Override 
protected void onPostExecute(String sResponse) { 

     if (dialog.isShowing()) 
      dialog.dismiss(); 
    try { 
     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); 
    } 
} 
}} 
0

Вы могли бы получать исключение.

У вас есть это в doInbackground.

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

doInbackground вызывается на фоне нити. Вы не можете отображать тост/обновление 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(); 
     } 

Для получения дополнительной информации проверьте документацию по теме 4 шага.

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

+0

Это правда. Чтобы отобразить Toast, используйте 'publishProgress()' и 'onProgressUpdate()' – KickAss

0

Возможно ваш метод doInBackGround бросает исключение. Также вы можете удалить супер. super.onPostExecute() как избыточно.

Смежные вопросы