Android 使用线程在imageview中显示图像

Android 使用线程在imageview中显示图像,android,multithreading,android-imageview,ftp-client,Android,Multithreading,Android Imageview,Ftp Client,大家好,我是艾曼,我是学生 我正在创建一个应用程序,显示从ftp服务器下载的图像,该图像由网络摄像头标记 我想每2秒刷新一次图片,但我没有成功,即使只有一次plz帮助这是我的代码,直到现在 **主要活动** package com.pfe.ftpstreamer; import java.io.FileOutputStream; import com.pfe.ftpstreamer.R; import com.pfe.ftpstreamer.MyFTPClient; import andr

大家好,我是艾曼,我是学生 我正在创建一个应用程序,显示从ftp服务器下载的图像,该图像由网络摄像头标记
我想每2秒刷新一次图片,但我没有成功,即使只有一次plz帮助这是我的代码,直到现在 **主要活动**

package com.pfe.ftpstreamer;

import java.io.FileOutputStream;

import com.pfe.ftpstreamer.R;
import com.pfe.ftpstreamer.MyFTPClient;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private static final String TEMP_FILENAME = "test.txt";
private static final String TEMP_FILENAME1 = "cam.jpg";
private Context cntx = null;

MyFTPClient ftpclient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    cntx = this.getBaseContext();

    View startButton = findViewById(R.id.button1);
    startButton.setOnClickListener(this);
    View stopButton = findViewById(R.id.button2);
    stopButton.setOnClickListener(this);
    View exitButton = findViewById(R.id.button3);
    exitButton.setOnClickListener(this);
 // Create a temporary file. You can use this to upload
    createDummyFile();
    ftpclient = new MyFTPClient();
}
public void onClick(View v) {
    switch(v.getId()) {
    case R.id.button1:
        new Thread(new Runnable() {
            public void run(){
                boolean status = false;
                // Replace your UID & PW here
                status = ftpclient.ftpConnect("192.168.1.1", "Administrator", "12345", 21);
                if (status == true) {
                    Log.d(TAG, "Connection Success");
                    status = ftpclient.ftpUpload(TEMP_FILENAME, TEMP_FILENAME, "/", cntx);
                    //downloading file
                    ftpclient.ftpDownload(TEMP_FILENAME1,getFilesDir() + "/" +TEMP_FILENAME1);
                    //removing the file from server 
                    ftpclient.ftpRemoveFile(TEMP_FILENAME1);
                    //showing the file in the ImageView
                    new Thread(new Runnable() {
                        public void run(){
                            ImageView imgView = (ImageView) findViewById(R.id.imageView1);
                            imgView.setImageBitmap(BitmapFactory.decodeFile(getFilesDir() + "/" +TEMP_FILENAME1));
                        }
                    }).start();



                } else {
                    //Toast.makeText(getApplicationContext(), "Connection failed", 2000).show();
                    Log.d(TAG, "Connection failed");
                }
            }
        }).start();
        break;  
    case R.id.button2:
        new Thread(new Runnable() {
            public void run(){
                ftpclient.ftpDisconnect();
            }
        }).start();

        break;
    case R.id.button3:
        this.finish();
        break;
    }

}

public void createDummyFile() {
    try {
        FileOutputStream fos;
        String file_content = "Hi this is a sample file to upload for android FTP client example";

        fos = openFileOutput(TEMP_FILENAME, MODE_PRIVATE);
        fos.write(file_content.getBytes());
        fos.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}}
*myftpclient**

package com.pfe.ftpstreamer;

import java.io.FileOutputStream;

import com.pfe.ftpstreamer.R;
import com.pfe.ftpstreamer.MyFTPClient;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private static final String TEMP_FILENAME = "test.txt";
private static final String TEMP_FILENAME1 = "cam.jpg";
private Context cntx = null;

MyFTPClient ftpclient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    cntx = this.getBaseContext();

    View startButton = findViewById(R.id.button1);
    startButton.setOnClickListener(this);
    View stopButton = findViewById(R.id.button2);
    stopButton.setOnClickListener(this);
    View exitButton = findViewById(R.id.button3);
    exitButton.setOnClickListener(this);
 // Create a temporary file. You can use this to upload
    createDummyFile();
    ftpclient = new MyFTPClient();
}
public void onClick(View v) {
    switch(v.getId()) {
    case R.id.button1:
        new Thread(new Runnable() {
            public void run(){
                boolean status = false;
                // Replace your UID & PW here
                status = ftpclient.ftpConnect("192.168.1.1", "Administrator", "12345", 21);
                if (status == true) {
                    Log.d(TAG, "Connection Success");
                    status = ftpclient.ftpUpload(TEMP_FILENAME, TEMP_FILENAME, "/", cntx);
                    //downloading file
                    ftpclient.ftpDownload(TEMP_FILENAME1,getFilesDir() + "/" +TEMP_FILENAME1);
                    //removing the file from server 
                    ftpclient.ftpRemoveFile(TEMP_FILENAME1);
                    //showing the file in the ImageView
                    new Thread(new Runnable() {
                        public void run(){
                            ImageView imgView = (ImageView) findViewById(R.id.imageView1);
                            imgView.setImageBitmap(BitmapFactory.decodeFile(getFilesDir() + "/" +TEMP_FILENAME1));
                        }
                    }).start();



                } else {
                    //Toast.makeText(getApplicationContext(), "Connection failed", 2000).show();
                    Log.d(TAG, "Connection failed");
                }
            }
        }).start();
        break;  
    case R.id.button2:
        new Thread(new Runnable() {
            public void run(){
                ftpclient.ftpDisconnect();
            }
        }).start();

        break;
    case R.id.button3:
        this.finish();
        break;
    }

}

public void createDummyFile() {
    try {
        FileOutputStream fos;
        String file_content = "Hi this is a sample file to upload for android FTP client example";

        fos = openFileOutput(TEMP_FILENAME, MODE_PRIVATE);
        fos.write(file_content.getBytes());
        fos.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}}

好的,您的问题是,您不在UI线程中

您可以使用AsyncTask或处理程序来更新视图或布局


检查此项:

您应该检查图像是否已下载,如果图像已下载,则可以在UI线程中更新您的UI,即

mainActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        ImageView imgView = (ImageView) findViewById(R.id.imageView1);
       imgView.setImageBitmap(BitmapFactory.decodeFile(getFilesDir() + "/" +TEMP_FILENAME1));
      }
}

您不能直接从线程使用处理程序更新Ui
检查此

是否检查图像是否已下载?程序正在下载图像。我从FTP服务器的日志中检查了图像,但现在当我尝试运行应用程序时,它崩溃,在日志中显示这些消息。程序正在下载图像。我从FTP服务器的日志中检查了图像,但现在当我尝试运行应用程序时,它崩溃了在logcat 05-13 15:53:35.467中显示这些消息的崩溃:W/dalvikvm(3098):threadid=10:线程以未捕获异常退出(group=0xb4d90908)05-13 15:53:35.467:E/AndroidRuntime(3098):致命异常:thread-140 E/AndroidRuntime(3098):java.lang.NoClassDefFoundError:org.apache.com.ftp客户端E/AndroidRuntime(3098):在com.pfe.ftpstreamer.MyFTPClient.ftpConnect(MyFTPClient.java:24)上,我认为您缺少在项目中包含一些jar文件。从这里下载合适的jar文件,然后尝试修复它。我有jar文件,但是旧版本v2.0.0我应该更新它们吗?是的,你可以,请确保jar在
org.apache.commons.net.ftp
包中有类
FTPClient
。我下载了更新,但仍然是相同的错误:(真的我不知道该怎么办。)