我正在尝试将文件throght webdav放入android,
执行程序后,Logcat出现android.os.NetworkOnMainThreadException
我试过两种方法来解决它,喜欢下面的代码
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
和这一个
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
它可以工作,但这些方式迫使我的项目关闭,
所以我认为它不适合在我的项目上使用
之后我就对它进行了研究,每个人都推荐这种方式来解决它
android.os.NetworkOnMainThreadException. How to solve it?
但我是初学者,我不知道如何填写我的代码,
我想知道如何以这种方式填写我的代码,
提前感谢您提供此处提供的任何帮助。
loginConfirmBtn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
getIpAddress = ipAddress.getText().toString().trim();
getUserName = userName.getText().toString().trim();
getPassWord = passWord.getText().toString().trim();
uploadFiles(sourceFilePath);
Toast.makeText(MainActivity.this, "upload suseeful", Toast.LENGTH_SHORT).show();
hideKeyboard();
} else {
Toast.makeText(MainActivity.this, "make sure you have connected the internet", Toast.LENGTH_SHORT).show();
}
public void uploadFiles(String dir){
Log.d("edoc","PutRunGenuine");
String fileFromEscan = dir;
Conn conn_adv = new Conn(new Constants(getUserName, getPassWord, getIpAddress, 80)); conn_adv.setUrl("/collab/my/"+conn_adv.getUser()+"/sourceFilePath2");
Log.d("edoc","edoc test");
if (fileFromEscan == null)
{
return;
}
try {
String putAvg = "PUT avg: ";
ExtractedMethod exm = new ExtractedMethod();
exm.run(HTCode.Code.PUT, 1, conn_adv, true, fileFromEscan, 1000, true);
Log.d("edoc","edoc_message hello");
synchronized(conn_adv){
conn_adv.notify();
}
} catch (Exception io) {
io.printStackTrace();
Log.d("edoc","edoc Exception"+io);
}
}
答案 0 :(得分:2)
android.os.NetworkOnMainThreadException
表示您在Network job
中执行了一些MainThread
。但是,任何网络作业都应该在Main(UI Thread)
您必须将uploadFiles(sourceFilePath);
方法移至BackgroundThread
。正如有些人在评论中建议的那样,您可以使用AsyncTask
并将方法移至doInBackground()
答案 1 :(得分:0)
hungwei0331,
您必须在异步任务的doInBackground()
函数内完成工作。
因为, Network operations are time-consuming so you can't execute this function on activity thread.
解决方案是使用asyncTask
或thread
。
答案 2 :(得分:0)
使用 AsyncTask 并在 doInBackground 中执行网络操作。
答案 3 :(得分:0)
最简单的方法是使用加入线程。它很难看但可行。
Thread t = new Thread(new Runnable() {
public void run() {
//do all here
});
}
});
t.Start();
t.Join();