繁体   English   中英

用于在主线程例外上载视频网络的改造

[英]Retrofit for uploading video-networkonmainthreadexception

我想将视频(从图库中选择)上传到服务器(本地主机在我的计算机上运行Apache 2.4.4)。 通过对该异常进行搜索,我发现不应在运行UI的线程中进行网络操作。 但是我应该怎么做呢? 我的代码如下:

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

堆栈跟踪: 在此处输入图片说明

AsyncTask提供了doInBackground方法。

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

您所需要做的就是使用翻新知识。 这是文件上传如何与Retrofit配合使用的说明。

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

在后台执行查询应使用回调机制来完成。 查询在后台进行,并且回调在主线程上执行。

如何使用Square的Retrofit网络库实现异步回调

using-squares-retrofit-networking-library在这里您可以找到定义带有回调的rest方法的好例子。

这就是您需要的一切。 甚至不要尝试更改线程策略,强烈建议不要这样做。

您需要使用AsyncTask执行它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM