Android后台运行的问题
我用socket上传数据到服务器,为了防止上传时间过长,所以将这一部分放在后台处理,但是onPostExecute已经运行了,也就是说doInBackground函数已经运行完毕,但是上传却没有成功,将上传代码放在Activity中操作,文件成功上传,这是为什么呢?
如果像调试后台程序,应该如何进行啊?
后台运行代码如下:
package lmx.graduate;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
public class uploadAsyncTask extends AsyncTask<String, Integer, String>{
public uploadAsyncTask(TextView textView)
{
this.textView = textView;
}
protected String doInBackground(String...param){
int i = 0;
for(i=1;i<=10000;i++)
publishProgress(i);
String path = getSDPath() +"/upload.txt";
try{
FileInputStream fileIS = new FileInputStream(path);
BufferedReader buf = new BufferedReader(new InputStreamReader(fileIS,"utf-8"));
String readString = new String();
int k = 0;
while((readString = buf.readLine())!= null){
k++;
Log.v("error", readString);
//向服务器发送信息
Socket socket = null;
try{
socket = new Socket("192.168.11.17",54321);
//向服务器发送信息
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(readString);
System.out.println(readString);
//接受服务器的信息
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mstr=br.readLine();
if(mstr!=null)
{
System.out.println(mstr);
}else
{
System.out.println("数据错误");
}
System.out.println("shangchuan");
out.close();
br.close();
socket.close();
}
catch (Exception e) {
// TODO: handle exception
}
}
fileIS.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return null;
}
//在doInBackground执行完毕后执行
protected void onPostExecute(String result)
{
textView.setText("本次上传已完成");
}
//在调用异步线程之后第一个执行,在主线程中进行
/**
*
* @param
* @return
* @author Administrator
*/
protected void onPreExecute()
{
textView.setText("开始上传");
}
protected void onProgressUpdate(Integer...values){
//textView.setText("请勿选择继续上传,请勿退出,系统正在上传,"+Integer.toString(values[0]));
textView.setText("请勿选择继续上传,请勿退出,系统正在上传");
}
public String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//获取跟目录
}
return sdDir.toString();
}
}
如果像调试后台程序,应该如何进行啊?
后台运行代码如下:
package lmx.graduate;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
public class uploadAsyncTask extends AsyncTask<String, Integer, String>{
public uploadAsyncTask(TextView textView)
{
this.textView = textView;
}
protected String doInBackground(String...param){
int i = 0;
for(i=1;i<=10000;i++)
publishProgress(i);
String path = getSDPath() +"/upload.txt";
try{
FileInputStream fileIS = new FileInputStream(path);
BufferedReader buf = new BufferedReader(new InputStreamReader(fileIS,"utf-8"));
String readString = new String();
int k = 0;
while((readString = buf.readLine())!= null){
k++;
Log.v("error", readString);
//向服务器发送信息
Socket socket = null;
try{
socket = new Socket("192.168.11.17",54321);
//向服务器发送信息
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(readString);
System.out.println(readString);
//接受服务器的信息
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mstr=br.readLine();
if(mstr!=null)
{
System.out.println(mstr);
}else
{
System.out.println("数据错误");
}
System.out.println("shangchuan");
out.close();
br.close();
socket.close();
}
catch (Exception e) {
// TODO: handle exception
}
}
fileIS.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return null;
}
//在doInBackground执行完毕后执行
protected void onPostExecute(String result)
{
textView.setText("本次上传已完成");
}
//在调用异步线程之后第一个执行,在主线程中进行
/**
*
* @param
* @return
* @author Administrator
*/
protected void onPreExecute()
{
textView.setText("开始上传");
}
protected void onProgressUpdate(Integer...values){
//textView.setText("请勿选择继续上传,请勿退出,系统正在上传,"+Integer.toString(values[0]));
textView.setText("请勿选择继续上传,请勿退出,系统正在上传");
}
public String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//获取跟目录
}
return sdDir.toString();
}
}
...全文
相关推荐
Android 14后台录音问题解决[可运行源码]
这一措施显著提升了用户的隐私安全,但同时也给开发者带来了新的挑战,尤其是在需要后台录音功能的应用中,如语音备忘录或通话录音工具。为了应对这一问题,文章详细介绍了两种可能的解决方案。
安卓Android源码——后台保持运行,开机后自动启动设定好的APK的DEMO.zip
这份"安卓Android源码——后台保持运行,开机后自动启动设定好的APK的DEMO.zip"正是为了解决这些问题而提供的示例代码。以下将详细解释相关知识点:1.
安卓实现后台拍照
在安卓系统中,调用相机功能需要`<uses-permission android:name="android.permission.CAMERA" />`权限,同时,由于涉及到用户隐私,后台运行应用访问相机可能还需要申请
这是一个专门为解决OPPO安卓设备上自动化应用MacroDroid在后台运行时无法正常调节系统音量这一特定兼容性问题而开发的辅助工具应用_它通过提供一个可配置的中间层服务或广播接收.zip
这款应用的主要功能是解决OPPO安卓设备上自动化应用在后台运行时无法调节系统音量的兼容性问题。
让app一直运行在后台且可以播放有声音乐Demo
这种功能在IoT设备上尤其重要,因为这些设备可能需要长时间运行音频服务,比如智能家居的背景音乐系统。描述中的内容虽然简短,但暗示了开发者可能遇到的问题:如何使应用在后台保持活跃状态,同时处理音乐播放。


