[英]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/
在后台执行查询应使用回调机制来完成。 查询在后台进行,并且回调在主线程上执行。
using-squares-retrofit-networking-library在这里您可以找到定义带有回调的rest方法的好例子。
这就是您需要的一切。 甚至不要尝试更改线程策略,强烈建议不要这样做。
您需要使用AsyncTask执行它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.