只有创建视图层次结构的原始线程才能触及它的视图 - Android
Only the original thread that created a view hierarchy can touch its views - Android
我正在使用 MultipartEntityBuilder 将图像发送到 php 服务器,我将照片和视频拍摄到设备相机到一个目录,我需要将文件保存在新的 ArrayList 上并将其发送到 php 服务器.
总是报错:
我的代码
private class MyAsyncTask extends AsyncTask<String, Integer, Double>
{
@Override
protected Double doInBackground (String... params)
{
String datos = value.getText().toString();
HttpClient httpClient = getNewHttpClient();
HttpPost httppost = new HttpPost("https://myurl.com");
try
{
path = Environment.getExternalStorageDirectory().toString() + "/mydirectory";
File fileArray = new File(path);
ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));
int itemCount = files.size();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
for (int i = 0; i < itemCount; i++)
{
builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
num_img++;
}
builder.addTextBody("response", "prueba");
HttpEntity entity = builder.build();
httppost.setEntity(entity);
//...............................
}
更新
protected void onPostExecute (Double result)
{
path = Environment.getExternalStorageDirectory().toString() + "/myDirectory";
runOnUiThread(new Runnable() {
@Override
public void run() {
File fileArray = new File(path);
ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));
int itemCount = files.size();
tv_files.setText("valor:" + itemCount);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addTextBody("response", "prueba");
for (int i = 0; i < itemCount; i++)
{
builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
num_img++;
}
HttpEntity entity = builder.build();
}
});
此错误试图告诉您永远不要在 UIThread
上 运行 上的任何线程之外触摸 UI 视图。
在您的 DoInBackground
中,您正在尝试获取 EditText
的值,这正在考虑对线程中的 UI 视图进行触摸 运行 s 在后台。
解决方案:
移动以下行
String datos = value.getText().toString();
在 doInBackground
方法之外到 onPreExcute()
或在 AsyncTask
的构造函数上。只需在 AsyncTask 中将 String datos
声明为全局变量,然后根据需要在 doInBackground()
中使用它
@Override
protected void onPreExecute() {
datos = value.getText().toString();
}
我正在使用 MultipartEntityBuilder 将图像发送到 php 服务器,我将照片和视频拍摄到设备相机到一个目录,我需要将文件保存在新的 ArrayList 上并将其发送到 php 服务器.
总是报错:
我的代码
private class MyAsyncTask extends AsyncTask<String, Integer, Double>
{
@Override
protected Double doInBackground (String... params)
{
String datos = value.getText().toString();
HttpClient httpClient = getNewHttpClient();
HttpPost httppost = new HttpPost("https://myurl.com");
try
{
path = Environment.getExternalStorageDirectory().toString() + "/mydirectory";
File fileArray = new File(path);
ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));
int itemCount = files.size();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
for (int i = 0; i < itemCount; i++)
{
builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
num_img++;
}
builder.addTextBody("response", "prueba");
HttpEntity entity = builder.build();
httppost.setEntity(entity);
//...............................
}
更新
protected void onPostExecute (Double result)
{
path = Environment.getExternalStorageDirectory().toString() + "/myDirectory";
runOnUiThread(new Runnable() {
@Override
public void run() {
File fileArray = new File(path);
ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));
int itemCount = files.size();
tv_files.setText("valor:" + itemCount);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addTextBody("response", "prueba");
for (int i = 0; i < itemCount; i++)
{
builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
num_img++;
}
HttpEntity entity = builder.build();
}
});
此错误试图告诉您永远不要在 UIThread
上 运行 上的任何线程之外触摸 UI 视图。
在您的 DoInBackground
中,您正在尝试获取 EditText
的值,这正在考虑对线程中的 UI 视图进行触摸 运行 s 在后台。
解决方案: 移动以下行
String datos = value.getText().toString();
在 doInBackground
方法之外到 onPreExcute()
或在 AsyncTask
的构造函数上。只需在 AsyncTask 中将 String datos
声明为全局变量,然后根据需要在 doInBackground()
中使用它
@Override
protected void onPreExecute() {
datos = value.getText().toString();
}