Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务FTP上载Android服务崩溃?_Java_Android_Service_Android Asynctask_Ftp Client - Fatal编程技术网

Java 异步任务FTP上载Android服务崩溃?

Java 异步任务FTP上载Android服务崩溃?,java,android,service,android-asynctask,ftp-client,Java,Android,Service,Android Asynctask,Ftp Client,我试图通过FTP上传设置目录中的文件。该文件名为“advancedsettings.xml” 在活动的异步任务中使用时,代码可以正常工作,但是当尝试使用服务在异步任务中执行完全相同的操作时,应用程序会崩溃,并出现以下错误: 01-13 16:21:08.403 21134-21151/com.name.example.xx E/AndroidRuntime﹕ 致命异常:AsyncTask#1进程:com.name.example.xx,PID:21134 java.lang.RuntimeExc

我试图通过FTP上传设置目录中的文件。该文件名为“advancedsettings.xml”

在活动的异步任务中使用时,代码可以正常工作,但是当尝试使用服务在异步任务中执行完全相同的操作时,应用程序会崩溃,并出现以下错误:

01-13 16:21:08.403 21134-21151/com.name.example.xx E/AndroidRuntime﹕ 致命异常:AsyncTask#1进程:com.name.example.xx,PID:21134 java.lang.RuntimeException:执行时出错 doInBackground()位于android.os.AsyncTask$3.done(AsyncTask.java:300)位于 java.util.concurrent.FutureTask.finishCompletion(F utureTask.java:355) 位于java.util.concurrent.FutureTask.setException(Futur-eTask.java:222) 在java.util.concurrent.FutureTask.run(FutureTask.java:242)中 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)在 java.util.concurrent.ThreadPoolExecutor.runWorker( java:1112)位于 java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)位于java.lang.Thread.run(Thread.java:841) 原因:java.lang.RuntimeException:无法在内部创建处理程序 尚未在处调用Looper.prepare()的线程 android.os.Handler.(Handler.java:200)位于 android.os.Handler.(Handler.java:114)位于 Toast$TN.(Toast.java:388)位于 Toast.(Toast.java:114)位于 android.widget.Toast.makeText(Toast.java:273)位于 com.name.example.xx.MyService$FTPUpload.doInBackgr ound(MyService.java:58)位于 com.name.example.xx.MyService$FTPUpload.doInBackgr ound(MyService.java:55)位于 android.os.AsyncTask$2.call(AsyncTask.java:288)位于 java.util.concurrent.FutureTask.run(FutureTask.java:237) ************在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) ************位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) ************位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) ************在java.lang.Thread.run(Thread.java:841)01-13 16:21:08.473 862-862/?W/ContextImpl﹕ 在系统中调用方法 没有合格用户的流程: android.app.ContextImpl.sendBroadcast:1505 com.android.server.analytics.data.collection.appli 阳离子.CrashAnrDetector.broadcastEvent:296 com.android.server.analytics.data.collection.appli 阳离子。CrashanDetector。processDropBoxEntry:254 com.android.server.analytics.data.collection.appli 阳离子。CrashanDetector。访问$100:60 com.android.server.analytics.data.collection.appli 阳离子crashanrd检测器$1.onReceive:102 01-13 16:21:08.713 862-21154/? E/android.os.Debug﹕ !@Dumpstate>sdumpstate-k-t-z-d-o /数据/日志/转储状态\应用程序\错误

以下是我如何在我的主要活动中调用服务(单击按钮):

这是服务代码:

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Toast.makeText(MyService.this, "service start", Toast.LENGTH_LONG).show();
    new FTPUpload().execute();

}

@Override
public void onDestroy() {
    super.onDestroy();


}

@Override
public void onLowMemory() {
    super.onLowMemory();

}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return super.onStartCommand(intent, flags, startId);

}

public class FTPUpload extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void...params) {

        Toast.makeText(MyService.this, "Service FTP Upload Start", Toast.LENGTH_LONG).show();

        FTPClient con = null;

        try

        {
            con = new FTPClient();
            con.connect("host");

            // Check your USERNAME e.g myuser@mywebspace.com and check your PASSWORD to ensure they are OK.
            if (con.login("username", "password")) {
                con.enterLocalPassiveMode(); // important!
                con.setFileType(FTP.BINARY_FILE_TYPE);

                Random rand = new Random();
                String randomIntString = String.valueOf(rand.nextInt()).replaceAll("-", "");


                FileInputStream in = new FileInputStream("/storage/emulated/0/");
                //con.makeDirectory("/" + randomIntString + "/");
                con.storeFile("advancedsettings.xml", in);
                in.close();


                //PASS URL TO NEXT ACTIVITY AND LAUNCH NEXT ACTIVITY ON NOTIFICATION CLICK


            } else {


            }
        } catch (
                Exception e
                )

        { //if file does not upload successfully, write an error log.
            Toast.makeText(MyService.this, "An error occured, please report: " + e, Toast.LENGTH_LONG).show();
        }

        Toast.makeText(MyService.this, "Service FTP Upload Complete", Toast.LENGTH_LONG).show();

        return null;
    }

}
公共类MyService扩展服务{
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
Toast.makeText(MyService.this,“服务开始”,Toast.LENGTH_LONG.show();
新建FTPUpload().execute();
}
@凌驾
公共空间{
super.ondestory();
}
@凌驾
public void onLowMemory(){
super.onLowMemory();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
返回super.onStartCommand(intent、flags、startId);
}
公共类FTPUpload扩展异步任务{
受保护的Void doInBackground(Void…参数){
Toast.makeText(MyService.this,“服务FTP上传开始”,Toast.LENGTH_LONG.show();
FTPClient con=null;
尝试
{
con=新的FTPClient();
con.connect(“主机”);
//检查你的用户名,例如myuser@mywebspace.com并检查您的密码以确保它们正常。
if(con.login(“用户名”、“密码”)){
con.enterLocalPassiveMode();//重要!
con.setFileType(FTP.BINARY文件类型);
Random rand=新的Random();
String randomIntString=String.valueOf(rand.nextInt()).replaceAll(“-”,”);
FileInputStream in=newfileinputstream(“/storage/simulated/0/”);
//con.makeDirectory(“/”+randomIntString+“/”);
con.storeFile(“advancedsettings.xml”,在中);
in.close();
//将URL传递给下一个活动,并在通知单击时启动下一个活动
}否则{
}
}抓住(
例外情况e
)
{//如果文件未能成功上载,请编写错误日志。
Toast.makeText(MyService.this,“出现错误,请报告:”+e,Toast.LENGTH_LONG).show();
}
Toast.makeText(MyService.this,“服务FTP上传完成”,Toast.LENGTH_LONG.show();
返回null;
}
}
}

我可以确认我已经在我的Android清单文件中的应用程序标记中声明了该服务,如下所示:

<service android:name=".MyService"/>

有什么想法吗,伙计们?非常感谢您的帮助!我很想弄清这件事的真相

K

这里

Toast.makeText(MyService.this, "Service FTP Upload Start", Toast.LENGTH_LONG).show();
您正在尝试从
doInBackground
(从其他线程)执行soat
Toast
。使用
onPreExecute
在开始
doInBackground
执行之前显示Toast

Toast.makeText(MyService.this, "Service FTP Upload Start", Toast.LENGTH_LONG).show();

您正在尝试从
doInBackground
(从其他线程)执行soat
Toast
。使用
onPreExecute
在开始执行
doInBackground
之前显示Toast

请不要从
doInBackground
访问主线程,比如运行
Toast
。对于这种操作,请使用
onPreExecute

Toast.makeText(MyService.this, 
               "Service FTP Upload Start", 
               Toast.LENGTH_LONG).show();
doInBackground
应该/不能访问UI线程。对于您完成的任务
祝酒
尝试从
doInBackground
返回一个值,您将得到返回的值