2015-11-12 2 views
0

Я хочу загрузить видео (выбранное из галереи) на сервер (localhost-Wampserver работает на Apache 2.4.4 на моем компьютере). Из исключения и поиска по нему я узнал, что сетевая операция не должна происходить в потоке, на котором работает пользовательский интерфейс. но как мне это сделать? Мой код приведен ниже:Модернизация для загрузки видео-networkonmainthreadexception

PostFile:

public final class PostFile 
{ 
    public static final MediaType MEDIA_TYPE_MARKDOWN 
     = MediaType.parse("vide/mp4"); 

    private final OkHttpClient client = new OkHttpClient(); 

    public void run(String path) throws Exception 
    { 
    File file = new File(path); 

    Request request = new Request.Builder() 
     .url("http://192.168.1.7") 
     .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file)) 
     .build(); 

    Response response = client.newCall(request).execute(); 
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

     System.out.println(response.body().string()); 
    } 

} 

MainActivity.java:

public class MainActivity extends Activity 
{ 
    private static int RESULT_LOAD_IMG = 1; 
    String decodableString; 

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

    public void loadImagefromGallery(View view) 
    { 
     // Create intent to Open Image applications like Gallery, Google Photos 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); 
     // Start the Intent 
     startActivityForResult(galleryIntent, RESULT_LOAD_IMG); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 
     try { 
      // When a video is picked 
      if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK 
        && null != data) 
      { 
       // Get the video from data 
       Uri selectedVideo = data.getData(); 
       String[] filePathColumn = { MediaStore.Video.Media.DATA }; 
       Cursor cursor = getContentResolver().query(selectedVideo, 
         filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       decodableString = cursor.getString(columnIndex); 
       Log.i("mok",decodableString); 
       cursor.close(); 
       new PostFile().run(decodableString); 
       Log.i("mok","done"); 
      } else 
      { 
       Toast.makeText(this, "You haven't picked any video", 
         Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
      Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG) 
         .show(); 
      } 
     } 
} 

Стек след: enter image description here

+1

В следующий раз не делайте снимок экрана об ошибке. Просто скопируйте его и вставьте как код. Гораздо легче это прочитать. –

+0

@DamianKozlak Не знаю, как скопировать их (всего сразу) в logcat – mok

+1

Просто выберите его мышью ... :) –

ответ

2

Все, что нужно сделать это знание об использовании Дооснащения. Вот объяснение того, как загружать файлы с помощью Retrofit и как это сделать.

https://futurestud.io/blog/retrofit-how-to-upload-files/

Выполнения запросы в фоновом режиме должны быть сделаны с механизмом обратных вызовов. Запрос идет в фоновом режиме, и обратный вызов выполняется на mainthread.

How to implement an async Callback using Square's Retrofit networking library

с использованием квадраты-Модифицированная-сеть библиотеки Здесь вы можете найти хороший пример определения методов Модифицированной отдыха с обратными вызовами.

Это все, что вам нужно. Даже не пытайтесь изменить политику потоков, это настоятельно не рекомендуется.

+0

Upvoted. Я забыл, что @mok использует Retrofit, поэтому это гораздо лучшее решение, используя методы из Retrofit вместо 'AsyncTask'. –

+0

@DamianKozlak точно. Я действительно запутался, потому что думал, что использовать Retrofit мне не нужно использовать AsyncTask. – mok

+0

Благодарим вас за ссылки и особенно за последний абзац. Но, оба они кажутся слишком продвинутыми. Я имею в виду, что у меня нет никаких предварительных знаний об использовании этих API. Не могли бы вы упомянуть рабочий пример (как бы он ни был прост, просто он работает, тогда я пойму другие вещи). – mok

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